home *** CD-ROM | disk | FTP | other *** search
/ C & C++ Multimedia Cyber Classroom / C and C++ Multimedia Cyber Classroom (Prentice Hall) (1998).iso / cpphtp2 / cpphtp2.jar / chpt_20.gml < prev    next >
Text File  |  1998-03-03  |  274KB  |  6,274 lines

  1. <html>
  2. <chapter>
  3. <section type=Popup name=Terminology title="Terminology">
  4. <page>
  5. <font size=14>
  6. A<br>
  7. <b>accumulate</b> 
  8. <a href="%s5p26"><img src=iicons/bullbib.gif></a>
  9. <a href="%s5p30"><img src=iicons/bullbib.gif></a>
  10.  
  11. <a href="%s7p0"><img src=iicons/bullbib.gif></a>
  12. <a href="%s7p2"><img src=iicons/bullbib.gif></a>
  13. <br>
  14. adapters 
  15. <a href="%s4p0"><img src=iicons/bullbib.gif></a>
  16. <br>
  17. <b>adjacent_difference()</b> 
  18. algorithm 
  19. <a href="^Illustration::c:s0p18"><img src=iicons/bullbib.gif></a>
  20. <br>
  21. <b>adjacent-find()</b> 
  22. algorithm 
  23. <a href="^Illustration::c:s0p17"><img src=iicons/bullbib.gif></a>
  24. <br>
  25. <b><algorithm></b> 
  26. <a href="%s2p17"><img src=iicons/bullbib.gif></a>
  27. <br>
  28. algorithm 
  29. <a href="%s1p0"><img src=iicons/bullbib.gif></a>
  30. <a href="^Engineer::c:s0p1"><img src=iicons/bullbib.gif></a>
  31. <a href="%s1p25"><img src=iicons/bullbib.gif></a>
  32. <a href="%s5p0"><img src=iicons/bullbib.gif></a>
  33. <br>
  34. <b>assign</b> 
  35. <a href="%s2p32"><img src=iicons/bullbib.gif></a>
  36. <br>
  37. assignment operator (<b>=</b>) 
  38.  
  39. <a href="%s1p13"><img src=iicons/bullbib.gif></a>
  40. <br>
  41. associative array 
  42. <a href="%s3p24"><img src=iicons/bullbib.gif></a>
  43. <br>
  44. </font>
  45.  
  46. </page>
  47. <page>
  48. <font size=14>
  49. associative container 
  50. <a href="%s1p9"><img src=iicons/bullbib.gif></a>
  51.  
  52. <a href="^Illustration::c:s0p8"><img src=iicons/bullbib.gif></a>
  53. <a href="^Illustration::c:s0p12"><img src=iicons/bullbib.gif></a>
  54. <a href="%s3p0"><img src=iicons/bullbib.gif></a>
  55. <a href="%s3p7"><img src=iicons/bullbib.gif></a>
  56. <br>
  57. B<br>
  58. <b>back</b> 
  59. <a href="%s2p2"><img src=iicons/bullbib.gif></a>
  60. <a href="%s2p17"><img src=iicons/bullbib.gif></a>
  61. <a href="%s4p9"><img src=iicons/bullbib.gif></a>
  62. <br>
  63. <b>begin</b> 
  64. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  65. <a href="%s1p16"><img src=iicons/bullbib.gif></a>
  66. <a href="%s1p16"><img src=iicons/bullbib.gif></a>
  67. <a href="%s1p26"><img src=iicons/bullbib.gif></a>
  68. <a href="%s2p11"><img src=iicons/bullbib.gif></a>
  69.  
  70. <br>
  71. bidirectional iterator 
  72. <a href="^Illustration::c:s0p10"><img src=iicons/bullbib.gif></a>
  73.  
  74. <a href="^Illustration::c:s0p12"><img src=iicons/bullbib.gif></a>
  75. <a href="%s2p5"><img src=iicons/bullbib.gif></a>
  76. <a href="%s2p25"><img src=iicons/bullbib.gif></a>
  77. <a href="%s3p5"><img src=iicons/bullbib.gif></a>
  78. <a href="%s3p13"><img src=iicons/bullbib.gif></a>
  79.  
  80. <a href="%s3p19"><img src=iicons/bullbib.gif></a>
  81. <a href="%s5p46"><img src=iicons/bullbib.gif></a>
  82. <a href="%s5p51"><img src=iicons/bullbib.gif></a>
  83. <a href="%s5p54"><img src=iicons/bullbib.gif></a>
  84. <a href="%s5p56"><img src=iicons/bullbib.gif></a>
  85.  
  86. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  87. <br>
  88. <b>binary_search</b> 
  89. <a href="%s5p35"><img src=iicons/bullbib.gif></a>
  90. <a href="%s5p38"><img src=iicons/bullbib.gif></a>
  91.  
  92. <br>
  93. C<br>
  94. </font>
  95.  
  96. </page>
  97. <page>
  98. <font size=14>
  99. <b>const_iterator</b> 
  100. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  101. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  102.  
  103. <a href="%s1p17"><img src=iicons/bullbib.gif></a>
  104. <a href="^Illustration::c:s0p8"><img src=iicons/bullbib.gif></a>
  105. <a href="^Illustration::c:s0p15"><img src=iicons/bullbib.gif></a>
  106. <a href="^Debug::c:s0p5"><img src=iicons/bullbib.gif></a>
  107. <a href="%s2p10"><img src=iicons/bullbib.gif></a>
  108.  
  109. <a href="%s3p7"><img src=iicons/bullbib.gif></a>
  110. <a href="%s3p15"><img src=iicons/bullbib.gif></a>
  111. <a href="%s3p22"><img src=iicons/bullbib.gif></a>
  112.  
  113. <br>
  114. <b>const_reverse_iterator</b> 
  115.  
  116. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  117. <a href="^Illustration::c:s0p8"><img src=iicons/bullbib.gif></a>
  118. <a href="^Illustration::c:s0p15"><img src=iicons/bullbib.gif></a>
  119. <a href="%s2p13"><img src=iicons/bullbib.gif></a>
  120. <br>
  121. container 
  122. <a href="%s1p0"><img src=iicons/bullbib.gif></a>
  123. <a href="%s1p6"><img src=iicons/bullbib.gif></a>
  124. <a href="%s1p7"><img src=iicons/bullbib.gif></a>
  125. <a href="%s5p0"><img src=iicons/bullbib.gif></a>
  126. <br>
  127. container adapter 
  128. <a href="%s1p9"><img src=iicons/bullbib.gif></a>
  129. <a href="^Illustration::c:s0p12"><img src=iicons/bullbib.gif></a>
  130.  
  131. <a href="%s4p0"><img src=iicons/bullbib.gif></a>
  132. <br>
  133. <b>copy</b> 
  134. <a href="%s2p16"><img src=iicons/bullbib.gif></a>
  135.  
  136. <br>
  137. <b>copy_backward</b> 
  138. <a href="%s5p45"><img src=iicons/bullbib.gif></a>
  139.  
  140. <br>
  141. </font>
  142.  
  143. </page>
  144. <page>
  145. <font size=14>
  146. <b>count</b> 
  147. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  148. <a href="%s3p6"><img src=iicons/bullbib.gif></a>
  149. <a href="%s5p26"><img src=iicons/bullbib.gif></a>
  150.  
  151. <a href="%s6p2"><img src=iicons/bullbib.gif></a>
  152. <br>
  153. <b>count_if</b> 
  154. <a href="%s5p26"><img src=iicons/bullbib.gif></a>
  155. <a href="%s5p27"><img src=iicons/bullbib.gif></a>
  156. <br>
  157. creating an association 
  158.  
  159. <a href="%s3p26"><img src=iicons/bullbib.gif></a>
  160. <br>
  161. D<br>
  162. <b><deque></b> 
  163. <a href="^Illustration::c:s0p7"><img src=iicons/bullbib.gif></a>
  164. <a href="%s2p37"><img src=iicons/bullbib.gif></a>
  165. <br>
  166. <b>deque</b> sequence 
  167. container 
  168. <a href="%s2p35"><img src=iicons/bullbib.gif></a>
  169. <br>
  170. E<br>
  171. <b>empty</b> 
  172. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  173. <a href="%s4p9"><img src=iicons/bullbib.gif></a>
  174. <a href="%s4p14"><img src=iicons/bullbib.gif></a>
  175.  
  176. <br>
  177. <b>end</b> 
  178. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  179. <a href="%s1p16"><img src=iicons/bullbib.gif></a>
  180. <a href="%s1p26"><img src=iicons/bullbib.gif></a>
  181. <a href="^Errors::c:s0p1"><img src=iicons/bullbib.gif></a>
  182. <a href="%s2p11"><img src=iicons/bullbib.gif></a>
  183.  
  184. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  185. <br>
  186. </font>
  187.  
  188. </page>
  189. <page>
  190. <font size=14>
  191. <b>equal</b> 
  192. <a href="%s5p6"><img src=iicons/bullbib.gif></a>
  193. <a href="%s5p6"><img src=iicons/bullbib.gif></a>
  194. <br>
  195. <b>equal_range</b> 
  196. <a href="%s3p10"><img src=iicons/bullbib.gif></a>
  197.  
  198. <a href="%s5p68"><img src=iicons/bullbib.gif></a>
  199. <a href="%s5p70"><img src=iicons/bullbib.gif></a>
  200. <br>
  201. <b>erase</b> 
  202. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  203. <a href="%s2p20"><img src=iicons/bullbib.gif></a>
  204. <br>
  205. F<br>
  206. <b>fill</b> 
  207. <a href="%s5p1"><img src=iicons/bullbib.gif></a>
  208. <a href="%s5p1"><img src=iicons/bullbib.gif></a>
  209. <br>
  210. <b>fill_n</b> 
  211. <a href="%s5p1"><img src=iicons/bullbib.gif></a>
  212. <a href="%s5p2"><img src=iicons/bullbib.gif></a>
  213. <br>
  214. <b>find</b> 
  215. <a href="%s1p26"><img src=iicons/bullbib.gif></a>
  216. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  217. <a href="%s3p7"><img src=iicons/bullbib.gif></a>
  218. <a href="%s3p7"><img src=iicons/bullbib.gif></a>
  219.  
  220. <a href="%s5p35"><img src=iicons/bullbib.gif></a>
  221. <a href="%s5p35"><img src=iicons/bullbib.gif></a>
  222. <br>
  223. first-class container 
  224. <a href="%s1p9"><img src=iicons/bullbib.gif></a>
  225.  
  226. <a href="%s1p12"><img src=iicons/bullbib.gif></a>
  227. <a href="%s1p15"><img src=iicons/bullbib.gif></a>
  228. <a href="%s1p22"><img src=iicons/bullbib.gif></a>
  229. <a href="%s2p12"><img src=iicons/bullbib.gif></a>
  230. <a href="%s2p20"><img src=iicons/bullbib.gif></a>
  231. <br>
  232. first-in first-out (FIFO) 
  233.  
  234. <a href="^Illustration::c:s0p3"><img src=iicons/bullbib.gif></a>
  235. <a href="%s4p8"><img src=iicons/bullbib.gif></a>
  236. <br>
  237. <b>for_each</b> 
  238. <a href="%s5p26"><img src=iicons/bullbib.gif></a>
  239. <a href="%s5p31"><img src=iicons/bullbib.gif></a>
  240. <br>
  241. </font>
  242.  
  243. </page>
  244. <page>
  245. <font size=14>
  246. forward iterator 
  247. <a href="^Illustration::c:s0p10"><img src=iicons/bullbib.gif></a>
  248. <a href="%s2p5"><img src=iicons/bullbib.gif></a>
  249.  
  250. <a href="%s5p22"><img src=iicons/bullbib.gif></a>
  251. <a href="%s5p38"><img src=iicons/bullbib.gif></a>
  252. <a href="%s5p42"><img src=iicons/bullbib.gif></a>
  253. <a href="%s5p42"><img src=iicons/bullbib.gif></a>
  254. <a href="%s5p50"><img src=iicons/bullbib.gif></a>
  255.  
  256. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  257. <br>
  258. <b>front</b> 
  259. <a href="%s2p2"><img src=iicons/bullbib.gif></a>
  260. <a href="%s2p17"><img src=iicons/bullbib.gif></a>
  261. <a href="%s4p9"><img src=iicons/bullbib.gif></a>
  262.  
  263. <a href="%s4p14"><img src=iicons/bullbib.gif></a>
  264. <br>
  265. function object 
  266. <a href="%s3p4"><img src=iicons/bullbib.gif></a>
  267. <a href="%s3p18"><img src=iicons/bullbib.gif></a>
  268.  
  269. <a href="%s7p0"><img src=iicons/bullbib.gif></a>
  270. <a href="%s7p1"><img src=iicons/bullbib.gif></a>
  271. <a href="^Engineer::c:s0p14"><img src=iicons/bullbib.gif></a>
  272. <br>
  273. <b><functional></b> 
  274. <a href="%s7p0"><img src=iicons/bullbib.gif></a>
  275. <a href="%s7p3"><img src=iicons/bullbib.gif></a>
  276. <br>
  277. G<br>
  278. <b>generate</b> 
  279. <a href="%s5p1"><img src=iicons/bullbib.gif></a>
  280. <a href="%s5p3"><img src=iicons/bullbib.gif></a>
  281. <br>
  282. <b>generate_n</b> 
  283. <a href="%s5p1"><img src=iicons/bullbib.gif></a>
  284. <a href="%s5p4"><img src=iicons/bullbib.gif></a>
  285.  
  286. <br>
  287. generic programming 
  288. <a href="%s1p1"><img src=iicons/bullbib.gif></a>
  289.  
  290. <a href="^Engineer::c:s0p0"><img src=iicons/bullbib.gif></a>
  291. <a href="^Perform::c:s0p5"><img src=iicons/bullbib.gif></a>
  292. <a href="%s9p8"><img src=iicons/bullbib.gif></a>
  293. <br>
  294. </font>
  295.  
  296. </page>
  297. <page>
  298. <font size=14>
  299. I<br>
  300. <b>inplace_merge</b> 
  301. <a href="%s5p53"><img src=iicons/bullbib.gif></a>
  302.  
  303. <br>
  304. input iterator 
  305. <a href="^Illustration::c:s0p10"><img src=iicons/bullbib.gif></a>
  306. <a href="^Illustration::c:s0p13"><img src=iicons/bullbib.gif></a>
  307. <a href="^Illustration::c:s0p13"><img src=iicons/bullbib.gif></a>
  308.  
  309. <a href="%s5p7"><img src=iicons/bullbib.gif></a>
  310. <a href="%s5p10"><img src=iicons/bullbib.gif></a>
  311. <a href="%s5p15"><img src=iicons/bullbib.gif></a>
  312. <a href="%s5p23"><img src=iicons/bullbib.gif></a>
  313. <a href="%s5p27"><img src=iicons/bullbib.gif></a>
  314.  
  315. <a href="%s5p28"><img src=iicons/bullbib.gif></a>
  316. <a href="%s5p29"><img src=iicons/bullbib.gif></a>
  317. <a href="%s5p47"><img src=iicons/bullbib.gif></a>
  318. <a href="%s5p59"><img src=iicons/bullbib.gif></a>
  319. <a href="%s5p60"><img src=iicons/bullbib.gif></a>
  320.  
  321. <a href="%s5p62"><img src=iicons/bullbib.gif></a>
  322. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  323. <br>
  324. <b>insert</b> 
  325. <a href="%s2p19"><img src=iicons/bullbib.gif></a>
  326.  
  327. <a href="%s3p8"><img src=iicons/bullbib.gif></a>
  328. <a href="%s3p21"><img src=iicons/bullbib.gif></a>
  329.  
  330. <br>
  331. <b>istream_iterator</b> 
  332. <a href="%s1p17"><img src=iicons/bullbib.gif></a>
  333. <br>
  334. <b>iter_swap</b> 
  335. <a href="%s5p41"><img src=iicons/bullbib.gif></a>
  336. <br>
  337. <b><iterator></b> 
  338. <a href="%s5p49"><img src=iicons/bullbib.gif></a>
  339. <br>
  340. iterator 
  341. <a href="%s1p0"><img src=iicons/bullbib.gif></a>
  342. <a href="%s1p15"><img src=iicons/bullbib.gif></a>
  343. <br>
  344. </font>
  345.  
  346. </page>
  347. <page>
  348. <font size=14>
  349. L<br>
  350. last-in first-out (LIFO) 
  351. data structure 
  352. <a href="^Illustration::c:s0p3"><img src=iicons/bullbib.gif></a>
  353. <a href="%s4p3"><img src=iicons/bullbib.gif></a>
  354. <br>
  355. <b>lexicographical_compa
  356. re</b> 
  357. <a href="%s5p6"><img src=iicons/bullbib.gif></a>
  358. <a href="%s5p10"><img src=iicons/bullbib.gif></a>
  359. <br>
  360. <b><list></b> 
  361. <a href="^Illustration::c:s0p7"><img src=iicons/bullbib.gif></a>
  362. <br>
  363. <b>list</b> sequence container 
  364.  
  365. <a href="%s2p25"><img src=iicons/bullbib.gif></a>
  366. <br>
  367. <b>lower_bound</b> 
  368. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  369. <a href="%s3p9"><img src=iicons/bullbib.gif></a>
  370.  
  371. <a href="%s5p68"><img src=iicons/bullbib.gif></a>
  372. <a href="%s5p68"><img src=iicons/bullbib.gif></a>
  373. <a href="%s5p70"><img src=iicons/bullbib.gif></a>
  374.  
  375. <br>
  376. M<br>
  377. <b>make_heap</b> 
  378. <br>
  379. <b><map></b> 
  380. <a href="^Illustration::c:s0p7"><img src=iicons/bullbib.gif></a>
  381. <a href="%s3p25"><img src=iicons/bullbib.gif></a>
  382. <br>
  383. </font>
  384.  
  385. </page>
  386. <page>
  387. <font size=14>
  388. <b>map</b> associative 
  389. container 
  390. <a href="%s3p24"><img src=iicons/bullbib.gif></a>
  391. <br>
  392. <b>max</b> 
  393. <a href="%s5p79"><img src=iicons/bullbib.gif></a>
  394. <br>
  395. <b>max_element</b> 
  396. <a href="%s5p26"><img src=iicons/bullbib.gif></a>
  397. <a href="%s5p29"><img src=iicons/bullbib.gif></a>
  398.  
  399. <a href="%s5p29"><img src=iicons/bullbib.gif></a>
  400. <br>
  401. <b>max_size()</b> 
  402. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  403. <br>
  404. <b>merge</b> 
  405. <a href="%s2p26"><img src=iicons/bullbib.gif></a>
  406. <a href="%s2p30"><img src=iicons/bullbib.gif></a>
  407.  
  408. <a href="%s5p45"><img src=iicons/bullbib.gif></a>
  409. <a href="%s5p47"><img src=iicons/bullbib.gif></a>
  410. <a href="%s5p48"><img src=iicons/bullbib.gif></a>
  411. <a href="%s5p48"><img src=iicons/bullbib.gif></a>
  412.  
  413. <br>
  414. <b>min</b> 
  415. <a href="%s5p79"><img src=iicons/bullbib.gif></a>
  416. <br>
  417. <b>min_element</b> 
  418. <a href="%s5p26"><img src=iicons/bullbib.gif></a>
  419. <a href="%s5p28"><img src=iicons/bullbib.gif></a>
  420.  
  421. <a href="^Practice::c:s0p1"><img src=iicons/bullbib.gif></a>
  422. <br>
  423. <b>mismatch</b> 
  424. <a href="%s5p6"><img src=iicons/bullbib.gif></a>
  425. <a href="%s5p8"><img src=iicons/bullbib.gif></a>
  426. <br>
  427. </font>
  428.  
  429. </page>
  430. <page>
  431. <font size=14>
  432. <b>multimap</b> 
  433. <a href="^Illustration::c:s0p3"><img src=iicons/bullbib.gif></a>
  434. <a href="^Illustration::c:s0p7"><img src=iicons/bullbib.gif></a>
  435. <a href="^Illustration::c:s0p12"><img src=iicons/bullbib.gif></a>
  436.  
  437. <a href="%s3p0"><img src=iicons/bullbib.gif></a>
  438. <a href="%s3p18"><img src=iicons/bullbib.gif></a>
  439. <a href="^Perform::c:s0p22"><img src=iicons/bullbib.gif></a>
  440. <br>
  441. <b>multiset</b> 
  442. <a href="^Illustration::c:s0p3"><img src=iicons/bullbib.gif></a>
  443. <a href="^Illustration::c:s0p7"><img src=iicons/bullbib.gif></a>
  444. <a href="^Illustration::c:s0p12"><img src=iicons/bullbib.gif></a>
  445. <a href="%s3p0"><img src=iicons/bullbib.gif></a>
  446.  
  447. <a href="%s3p8"><img src=iicons/bullbib.gif></a>
  448. <a href="%s3p18"><img src=iicons/bullbib.gif></a>
  449. <br>
  450. mutating-sequence 
  451. algorithms 
  452. <a href="%s1p27"><img src=iicons/bullbib.gif></a>
  453. <br>
  454. N<br>
  455. <b>namespace std</b> 
  456. <a href="%s1p11"><img src=iicons/bullbib.gif></a>
  457. <br>
  458. nonmutating sequence 
  459. algorithms 
  460. <a href="%s1p27"><img src=iicons/bullbib.gif></a>
  461. <a href="^Illustration::c:s0p17"><img src=iicons/bullbib.gif></a>
  462. <br>
  463. <b>nth_element</b> 
  464. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  465. <br>
  466. <b><numeric></b> 
  467. <a href="^Illustration::c:s0p18"><img src=iicons/bullbib.gif></a>
  468. <a href="%s5p30"><img src=iicons/bullbib.gif></a>
  469. <br>
  470. O<br>
  471. </font>
  472.  
  473. </page>
  474. <page>
  475. <font size=14>
  476. one-to-one mapping 
  477. <a href="^Illustration::c:s0p3"><img src=iicons/bullbib.gif></a>
  478.  
  479. <a href="%s3p24"><img src=iicons/bullbib.gif></a>
  480. <br>
  481. <b>operator!=</b> 
  482. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  483. <br>
  484. <b>operator<</b> 
  485. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  486. <a href="%s3p4"><img src=iicons/bullbib.gif></a>
  487. <br>
  488. <b>operator<=</b> 
  489. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  490. <br>
  491. <b>operator=</b> 
  492. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  493. <br>
  494. <b>operator==</b> 
  495. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  496. <a href="%s5p6"><img src=iicons/bullbib.gif></a>
  497. <br>
  498. <b>operator></b> 
  499. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  500. <br>
  501. <b>operator>=</b> 
  502. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  503. <br>
  504. <b>ostream_iterator</b> 
  505. <a href="%s1p17"><img src=iicons/bullbib.gif></a>
  506.  
  507. <br>
  508. output iterator 
  509. <a href="^Illustration::c:s0p10"><img src=iicons/bullbib.gif></a>
  510. <a href="^Illustration::c:s0p13"><img src=iicons/bullbib.gif></a>
  511. <a href="^Illustration::c:s0p13"><img src=iicons/bullbib.gif></a>
  512.  
  513. <a href="%s5p2"><img src=iicons/bullbib.gif></a>
  514. <a href="%s5p23"><img src=iicons/bullbib.gif></a>
  515. <a href="%s5p54"><img src=iicons/bullbib.gif></a>
  516. <a href="%s5p60"><img src=iicons/bullbib.gif></a>
  517. <a href="%s5p62"><img src=iicons/bullbib.gif></a>
  518.  
  519. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  520. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  521. <br>
  522. </font>
  523.  
  524. </page>
  525. <page>
  526. <font size=14>
  527. P<br>
  528. <b>partial_sort</b> 
  529. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  530. <br>
  531. <b>partial_sort_copy</b> 
  532. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  533. <br>
  534. <b>partial_sum</b> 
  535. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  536. <br>
  537. <b>partition</b> 
  538. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  539. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  540. <br>
  541. platform-independent 
  542. class libraries 
  543. <a href="%s1p4"><img src=iicons/bullbib.gif></a>
  544. <br>
  545. <b>pop</b> 
  546. <a href="%s4p0"><img src=iicons/bullbib.gif></a>
  547. <a href="%s4p6"><img src=iicons/bullbib.gif></a>
  548. <a href="%s4p10"><img src=iicons/bullbib.gif></a>
  549. <a href="%s4p13"><img src=iicons/bullbib.gif></a>
  550.  
  551. <br>
  552. <b>pop_back</b> 
  553. <a href="%s2p2"><img src=iicons/bullbib.gif></a>
  554. <a href="%s2p31"><img src=iicons/bullbib.gif></a>
  555.  
  556. <a href="%s4p4"><img src=iicons/bullbib.gif></a>
  557. <a href="%s4p13"><img src=iicons/bullbib.gif></a>
  558. <br>
  559. <b>pop_front</b> 
  560. <a href="%s2p26"><img src=iicons/bullbib.gif></a>
  561. <a href="%s2p31"><img src=iicons/bullbib.gif></a>
  562.  
  563. <a href="%s2p36"><img src=iicons/bullbib.gif></a>
  564. <a href="%s4p8"><img src=iicons/bullbib.gif></a>
  565. <br>
  566. <b>pop_heap</b> 
  567. <a href="%s5p76"><img src=iicons/bullbib.gif></a>
  568. <br>
  569. </font>
  570.  
  571. </page>
  572. <page>
  573. <font size=14>
  574. <b>priority_queue</b> adapter 
  575. class 
  576. <a href="%s4p14"><img src=iicons/bullbib.gif></a>
  577. <br>
  578. <b>push</b> 
  579. <a href="%s4p0"><img src=iicons/bullbib.gif></a>
  580. <a href="%s4p6"><img src=iicons/bullbib.gif></a>
  581. <a href="%s4p10"><img src=iicons/bullbib.gif></a>
  582. <a href="%s4p13"><img src=iicons/bullbib.gif></a>
  583.  
  584. <br>
  585. <b>push_back</b> 
  586. <a href="%s2p2"><img src=iicons/bullbib.gif></a>
  587. <a href="%s2p8"><img src=iicons/bullbib.gif></a>
  588. <a href="%s2p9"><img src=iicons/bullbib.gif></a>
  589.  
  590. <a href="%s2p27"><img src=iicons/bullbib.gif></a>
  591. <a href="%s4p3"><img src=iicons/bullbib.gif></a>
  592.  
  593. <a href="%s4p8"><img src=iicons/bullbib.gif></a>
  594. <a href="%s4p13"><img src=iicons/bullbib.gif></a>
  595. <a href="%s5p49"><img src=iicons/bullbib.gif></a>
  596. <br>
  597. <b>push_front</b> 
  598. <a href="%s2p26"><img src=iicons/bullbib.gif></a>
  599. <a href="%s2p27"><img src=iicons/bullbib.gif></a>
  600.  
  601. <a href="%s2p36"><img src=iicons/bullbib.gif></a>
  602. <br>
  603. <b>push_heap</b> 
  604. <a href="%s5p75"><img src=iicons/bullbib.gif></a>
  605. <a href="%s5p76"><img src=iicons/bullbib.gif></a>
  606.  
  607. <br>
  608. Q<br>
  609. <b>queue</b> 
  610. <a href="^Illustration::c:s0p3"><img src=iicons/bullbib.gif></a>
  611. <a href="^Illustration::c:s0p12"><img src=iicons/bullbib.gif></a>
  612. <a href="%s4p0"><img src=iicons/bullbib.gif></a>
  613. <a href="%s4p8"><img src=iicons/bullbib.gif></a>
  614.  
  615. <a href="%s4p10"><img src=iicons/bullbib.gif></a>
  616. <a href="^Perform::c:s0p26"><img src=iicons/bullbib.gif></a>
  617. <br>
  618. </font>
  619.  
  620. </page>
  621. <page>
  622. <font size=14>
  623. R<br>
  624. <b>random_shuffle</b> 
  625. <a href="%s5p26"><img src=iicons/bullbib.gif></a>
  626.  
  627. <a href="%s5p26"><img src=iicons/bullbib.gif></a>
  628. <br>
  629. random-access iterator 
  630.  
  631. <a href="%s1p21"><img src=iicons/bullbib.gif></a>
  632. <a href="^Illustration::c:s0p10"><img src=iicons/bullbib.gif></a>
  633. <a href="^Illustration::c:s0p12"><img src=iicons/bullbib.gif></a>
  634. <a href="%s2p5"><img src=iicons/bullbib.gif></a>
  635. <a href="%s2p5"><img src=iicons/bullbib.gif></a>
  636. <a href="^Debug::c:s0p7"><img src=iicons/bullbib.gif></a>
  637.  
  638. <a href="%s2p35"><img src=iicons/bullbib.gif></a>
  639. <a href="%s3p5"><img src=iicons/bullbib.gif></a>
  640. <a href="%s5p10"><img src=iicons/bullbib.gif></a>
  641. <a href="%s5p26"><img src=iicons/bullbib.gif></a>
  642. <a href="%s5p58"><img src=iicons/bullbib.gif></a>
  643.  
  644. <a href="%s5p74"><img src=iicons/bullbib.gif></a>
  645. <a href="%s5p76"><img src=iicons/bullbib.gif></a>
  646. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  647. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  648. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  649. <br>
  650. range 
  651. <a href="%s1p17"><img src=iicons/bullbib.gif></a>
  652. <a href="%s5p30"><img src=iicons/bullbib.gif></a>
  653. <br>
  654. <b>rbegin</b> 
  655. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  656. <a href="%s2p13"><img src=iicons/bullbib.gif></a>
  657. <br>
  658. <b>remove</b> 
  659. <a href="%s2p26"><img src=iicons/bullbib.gif></a>
  660. <a href="%s2p33"><img src=iicons/bullbib.gif></a>
  661.  
  662. <a href="%s5p13"><img src=iicons/bullbib.gif></a>
  663. <br>
  664. <b>remove_copy</b> 
  665. <a href="%s5p13"><img src=iicons/bullbib.gif></a>
  666. <a href="%s5p14"><img src=iicons/bullbib.gif></a>
  667.  
  668. <br>
  669. </font>
  670.  
  671. </page>
  672. <page>
  673. <font size=14>
  674. <b>remove_copy_if</b> 
  675. <a href="%s5p13"><img src=iicons/bullbib.gif></a>
  676.  
  677. <a href="%s5p17"><img src=iicons/bullbib.gif></a>
  678. <br>
  679. <b>remove_if</b> 
  680. <a href="%s5p13"><img src=iicons/bullbib.gif></a>
  681. <a href="%s5p15"><img src=iicons/bullbib.gif></a>
  682. <br>
  683. <b>rend</b> 
  684. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  685. <a href="%s2p13"><img src=iicons/bullbib.gif></a>
  686. <br>
  687. <b>replace</b> 
  688. <a href="%s5p20"><img src=iicons/bullbib.gif></a>
  689. <a href="%s5p20"><img src=iicons/bullbib.gif></a>
  690. <br>
  691. <b>replace_copy</b> 
  692. <a href="%s5p20"><img src=iicons/bullbib.gif></a>
  693. <a href="%s5p21"><img src=iicons/bullbib.gif></a>
  694.  
  695. <br>
  696. <b>replace_copy_if</b> 
  697. <a href="%s5p20"><img src=iicons/bullbib.gif></a>
  698.  
  699. <a href="%s5p23"><img src=iicons/bullbib.gif></a>
  700. <br>
  701. <b>replace_if</b> 
  702. <a href="%s5p20"><img src=iicons/bullbib.gif></a>
  703. <a href="%s5p22"><img src=iicons/bullbib.gif></a>
  704. <br>
  705. <b>reverse</b> 
  706. <a href="%s2p26"><img src=iicons/bullbib.gif></a>
  707. <a href="%s5p45"><img src=iicons/bullbib.gif></a>
  708. <a href="%s5p51"><img src=iicons/bullbib.gif></a>
  709.  
  710. <br>
  711. <b>reverse_copy</b> 
  712. <a href="%s5p53"><img src=iicons/bullbib.gif></a>
  713. <a href="%s5p56"><img src=iicons/bullbib.gif></a>
  714.  
  715. <br>
  716. </font>
  717.  
  718. </page>
  719. <page>
  720. <font size=14>
  721. <b>reverse_iterator</b> 
  722. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  723. <a href="^Illustration::c:s0p8"><img src=iicons/bullbib.gif></a>
  724.  
  725. <a href="^Illustration::c:s0p15"><img src=iicons/bullbib.gif></a>
  726. <a href="%s2p12"><img src=iicons/bullbib.gif></a>
  727. <a href="%s2p13"><img src=iicons/bullbib.gif></a>
  728. <br>
  729. <b>rotate</b> 
  730. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  731. <br>
  732. <b>rotate_copy</b> 
  733. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  734. <br>
  735. S<br>
  736. sequence 
  737. <a href="%s1p17"><img src=iicons/bullbib.gif></a>
  738. <a href="%s5p38"><img src=iicons/bullbib.gif></a>
  739. <a href="%s5p42"><img src=iicons/bullbib.gif></a>
  740.  
  741. <a href="%s5p48"><img src=iicons/bullbib.gif></a>
  742. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  743. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  744. <br>
  745. sequence container 
  746. <a href="%s1p9"><img src=iicons/bullbib.gif></a>
  747.  
  748. <a href="%s2p0"><img src=iicons/bullbib.gif></a>
  749. <a href="^Illustration::c:s0p12"><img src=iicons/bullbib.gif></a>
  750. <a href="%s2p19"><img src=iicons/bullbib.gif></a>
  751. <a href="%s2p27"><img src=iicons/bullbib.gif></a>
  752. <br>
  753. sequential container 
  754. <a href="%s1p9"><img src=iicons/bullbib.gif></a>
  755. <br>
  756. <b><set></b> 
  757. <a href="^Illustration::c:s0p7"><img src=iicons/bullbib.gif></a>
  758. <a href="%s3p5"><img src=iicons/bullbib.gif></a>
  759. <a href="%s3p13"><img src=iicons/bullbib.gif></a>
  760. <br>
  761. <b>set</b> associative container 
  762.  
  763. <a href="%s3p13"><img src=iicons/bullbib.gif></a>
  764. <br>
  765. </font>
  766.  
  767. </page>
  768. <page>
  769. <font size=14>
  770. <b>set_difference</b> 
  771. <a href="%s5p58"><img src=iicons/bullbib.gif></a>
  772. <a href="%s5p60"><img src=iicons/bullbib.gif></a>
  773.  
  774. <br>
  775. <b>set_intersection</b> 
  776. <a href="%s5p58"><img src=iicons/bullbib.gif></a>
  777.  
  778. <a href="%s5p61"><img src=iicons/bullbib.gif></a>
  779. <a href="%s5p61"><img src=iicons/bullbib.gif></a>
  780. <br>
  781. <b>set_symmetric_differen
  782. ce</b> 
  783. <a href="%s5p58"><img src=iicons/bullbib.gif></a>
  784. <a href="%s5p63"><img src=iicons/bullbib.gif></a>
  785. <br>
  786. <b>set_union</b> 
  787. <a href="%s5p58"><img src=iicons/bullbib.gif></a>
  788. <a href="%s5p65"><img src=iicons/bullbib.gif></a>
  789.  
  790. <br>
  791. <b>size</b> 
  792. <a href="%s1p10"><img src=iicons/bullbib.gif></a>
  793. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  794. <a href="%s2p7"><img src=iicons/bullbib.gif></a>
  795. <a href="%s2p9"><img src=iicons/bullbib.gif></a>
  796.  
  797. <a href="%s4p9"><img src=iicons/bullbib.gif></a>
  798. <a href="%s5p48"><img src=iicons/bullbib.gif></a>
  799. <a href="%s6p2"><img src=iicons/bullbib.gif></a>
  800. <br>
  801. <b>size_type</b> 
  802. <a href="^Illustration::c:s0p8"><img src=iicons/bullbib.gif></a>
  803. <br>
  804. <b>sort</b> 
  805. <a href="%s2p26"><img src=iicons/bullbib.gif></a>
  806. <a href="%s2p27"><img src=iicons/bullbib.gif></a>
  807.  
  808. <a href="%s5p35"><img src=iicons/bullbib.gif></a>
  809. <a href="%s5p37"><img src=iicons/bullbib.gif></a>
  810. <a href="^Illustration::c:s0p20"><img src=iicons/bullbib.gif></a>
  811. <br>
  812. <b>sort_heap</b> 
  813. <br>
  814. </font>
  815.  
  816. </page>
  817. <page>
  818. <font size=14>
  819. sorting 
  820. <a href="%s5p35"><img src=iicons/bullbib.gif></a>
  821. <br>
  822. <b><stack></b> 
  823. <a href="^Illustration::c:s0p7"><img src=iicons/bullbib.gif></a>
  824. <a href="%s4p4"><img src=iicons/bullbib.gif></a>
  825. <br>
  826. <b>stack</b> adapter class 
  827. <a href="%s4p4"><img src=iicons/bullbib.gif></a>
  828. <br>
  829. standard template library 
  830. (STL) 
  831. <a href="%s1p0"><img src=iicons/bullbib.gif></a>
  832. <br>
  833. <b>string</b> 
  834. <a href="%s1p9"><img src=iicons/bullbib.gif></a>
  835. <br>
  836. <b>swap</b> 
  837. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  838. <a href="%s2p32"><img src=iicons/bullbib.gif></a>
  839. <a href="%s5p41"><img src=iicons/bullbib.gif></a>
  840.  
  841. <br>
  842. <b>swap_ranges</b> 
  843. <a href="%s5p41"><img src=iicons/bullbib.gif></a>
  844. <br>
  845. T<br>
  846. <b>top</b> 
  847. <a href="%s4p4"><img src=iicons/bullbib.gif></a>
  848. <a href="%s4p14"><img src=iicons/bullbib.gif></a>
  849. <a href="%s4p15"><img src=iicons/bullbib.gif></a>
  850.  
  851. <br>
  852. <b>transform</b> 
  853. <a href="%s5p26"><img src=iicons/bullbib.gif></a>
  854. <a href="%s5p32"><img src=iicons/bullbib.gif></a>
  855. <br>
  856. U<br>
  857. </font>
  858.  
  859. </page>
  860. <page>
  861. <font size=14>
  862. <b>unique</b> 
  863. <a href="%s2p26"><img src=iicons/bullbib.gif></a>
  864. <a href="%s2p31"><img src=iicons/bullbib.gif></a>
  865.  
  866. <a href="%s5p45"><img src=iicons/bullbib.gif></a>
  867. <a href="%s5p50"><img src=iicons/bullbib.gif></a>
  868. <br>
  869. <b>upper_bound</b> 
  870. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  871. <a href="%s3p9"><img src=iicons/bullbib.gif></a>
  872.  
  873. <a href="%s5p68"><img src=iicons/bullbib.gif></a>
  874. <a href="%s5p70"><img src=iicons/bullbib.gif></a>
  875. <br>
  876. V<br>
  877. <b>valarray</b> 
  878. <a href="%s1p9"><img src=iicons/bullbib.gif></a>
  879. <br>
  880. <b>value_type</b> 
  881. <a href="%s1p12"><img src=iicons/bullbib.gif></a>
  882. <a href="^Illustration::c:s0p8"><img src=iicons/bullbib.gif></a>
  883. <a href="%s3p21"><img src=iicons/bullbib.gif></a>
  884.  
  885. <br>
  886. <b><vector></b> 
  887. <a href="^Illustration::c:s0p7"><img src=iicons/bullbib.gif></a>
  888. <a href="%s2p6"><img src=iicons/bullbib.gif></a>
  889. <br>
  890. <br>
  891. </font>
  892.  
  893. </page>
  894. </section>
  895. <section type=Popup name=Portable title="Portability">
  896. <page>
  897. STL is certain to 
  898. become the favored 
  899. means of programming 
  900. with containers. 
  901. Programming with STL 
  902. will enhance the 
  903. portability of your 
  904. code.<br>
  905. <br>
  906.  
  907. </page>
  908. <page>
  909. Because STL 
  910. algorithms process 
  911. containers only 
  912. indirectly through 
  913. iterators, one algorithm 
  914. can often be used with 
  915. many different 
  916. containers.<br>
  917. <br>
  918.  
  919. </page>
  920. </section>
  921. <section type=Popup name=Quotes title="Quotes">
  922. <page>
  923. <i>"Push on - keep moving."</i>   <br>
  924. Thomas Morton <br>
  925. <br>
  926.  
  927. </page>
  928. <page>
  929. <i>"Attempt the end, and 
  930. never stand to doubt; 
  931. Nothing's so hard but 
  932. search will find it out."</i>   <br>
  933. Robert Herrick <br>
  934. <br>
  935.  
  936. </page>
  937. <page>
  938. <i>"That great dust heap 
  939. called 'history.'" </i>  <br>
  940. Augustine Birrell <br>
  941. <br>
  942.  
  943. </page>
  944. <page>
  945. <i>"The historian is a 
  946. prophet in reverse."</i>   <br>
  947. Friedrich von Schlegel <br>
  948. <br>
  949.  
  950. </page>
  951. <page>
  952. <i>"Journey over all the 
  953. universe in a map."</i>   <br>
  954. Miguel de Cervantes   <br>
  955. <br>
  956.  
  957. </page>
  958. <page>
  959. <i>"O! thou hast damnable 
  960. iteration, and art indeed 
  961. able to corrupt a saint."</i>   <br>
  962. William Shakespeare<br>
  963. <br>
  964.  
  965. </page>
  966. <page>
  967. <i>"The shapes a bright 
  968. container can contain!"</i>  <br>
  969. <i>Theodore Roethke
  970. </i><br>
  971. <br>
  972.  
  973. </page>
  974. </section>
  975. <section type=Popup name=Illustration title="Illustrations">
  976. <page>
  977. <a href="^Illustration::c:s0p3">Fig. 20.1</a>  Standard Library container classes.<br>
  978. <a href="^Illustration::c:s0p4">Fig. 20.2</a>  Common functions for all STL containers.<br>
  979. <a href="^Illustration::c:s0p7">Fig. 20.3</a>  Standard Library container header files.<br>
  980. <a href="^Illustration::c:s0p8">Fig. 20.4</a>  Common <b>typedef</b>s found in first-class containers.<br>
  981. <a href="^Code::c:s0p0">Fig. 20.5</a>  Demonstrating input and output stream iterators.<br>
  982. <a href="^Illustration::c:s0p10">Fig. 20.6</a>  Iterator categories.<br>
  983. <a href="^Illustration::c:s0p11">Fig. 20.7</a>  Iterator category hierarchy.<br>
  984. <a href="^Illustration::c:s0p12">Fig. 20.8</a>  Iterator types supported by each Standard Library container.<br>
  985. <a href="^Illustration::c:s0p15">Fig. 20.9</a>  Predefined iterator <b>typedef</b>s.<br>
  986. <a href="^Illustration::c:s0p13">Fig. 20.10</a>  Iterator operations for each type of iterator.<br>
  987. <a href="^Illustration::c:s0p16">Fig. 20.11</a>  Mutating-sequence algorithms.<br>
  988. <a href="^Illustration::c:s0p17">Fig. 20.12</a>  Non-mutating sequence algorithms.<br>
  989. <a href="^Illustration::c:s0p18">Fig. 20.13 </a> Numerical algorithms from header file <b><numeric></b>.<br>
  990. <a href="^Code::c:s0p1">Fig. 20.14</a>  Demonstrating Standard Library <b>vector</b> class template.<br>
  991. <a href="^Code::c:s0p2">Fig. 20.15</a>  Demonstrating Standard Library <b>vector</b> class template element-manipulation 
  992. functions.<br>
  993. <a href="^Illustration::c:s0p19">Fig. 20.16</a>  STL exception types.<br>
  994. <a href="^Code::c:s0p3">Fig. 20.17</a>  Demonstrating Standard Library <b>list</b> class template.<br>
  995. <a href="^Code::c:s0p4">Fig. 20.18</a>  Demonstrating Standard Library <b>deque</b> class template.<br>
  996.  
  997. </page>
  998. <page>
  999. <a href="^Code::c:s0p5">Fig. 20.19</a>  Demonstrating Standard Library <b>multiset</b> class template.<br>
  1000. <a href="^Code::c:s0p6">Fig. 20.20</a>  Demonstrating Standard Library <b>set</b> class template.<br>
  1001. <a href="^Code::c:s0p7">Fig. 20.21</a>  Demonstrating Standard Library <b>multimap</b> class template.<br>
  1002. <a href="^Code::c:s0p8">Fig. 20.22</a>  Demonstrating Standard Library <b>map</b> class template.<br>
  1003. <a href="^Code::c:s0p9">Fig. 20.23</a>  Demonstrating Standard Library <b>stack</b> adapter class.<br>
  1004. <a href="^Code::c:s0p10">Fig. 20.24</a>  Demonstrating Standard Library <b>queue</b> adapter class templates.<br>
  1005. <a href="^Code::c:s0p11">Fig. 20.25</a>  Demonstrating Standard Library <b>priority_queue</b> adapter class.<br>
  1006. <a href="^Code::c:s0p12">Fig. 20.26</a>  Demonstrating Standard Library functions <b>fill</b>, <b>fill_n</b>, <b>generate</b> and <b>generate_n</b>.<br>
  1007. <a href="^Code::c:s0p13">Fig. 20.27</a>  Demonstrating Standard Library functions <b>equal</b>, <b>mismatch</b> and 
  1008. <b>lexicographical_compare</b>.<br>
  1009. <a href="^Code::c:s0p14">Fig. 20.28</a>  Demonstrating Standard Library functions <b>remove</b>, <b>remove_if</b>, <b>remove_copy</b> and 
  1010. <b>remove_copy_if</b>.<br>
  1011. <a href="^Code::c:s0p15">Fig. 20.29</a>  Demonstrating Standard Library functions <b>replace</b>, <b>replace_if</b>, <b>replace_copy</b> and 
  1012. <b>replace_copy_if</b>.<br>
  1013. <a href="^Code::c:s0p16">Fig. 20.30</a>  Demonstrating some mathematical algorithms of the Standard Library.<br>
  1014. <a href="^Code::c:s0p17">Fig. 20.31</a>  Basic searching and sorting algorithms of the Standard Library.<br>
  1015. <a href="^Code::c:s0p18">Fig. 20.32</a>  Demonstrating <b>swap</b>, <b>iter_swap</b> and <b>swap_ranges</b>.<br>
  1016. <a href="^Code::c:s0p19">Fig. 20.33</a>  Demonstrating <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse</b>.<br>
  1017. <a href="^Code::c:s0p20">Fig. 20.34</a>  Demonstrating <b>inplace_merge</b>, <b>unique_copy</b> and <b>reverse_copy</b>.<br>
  1018.  
  1019. </page>
  1020. <page>
  1021. <a href="^Code::c:s0p21">Fig. 20.35</a>  Demonstrating <b>set</b> operations of the Standard Library.<br>
  1022. <a href="^Code::c:s0p22">Fig. 20.36</a>  Demonstrating <b>lower_bound</b>, <b>upper_bound</b> and <b>equal_range</b>.<br>
  1023. <a href="^Code::c:s0p23">Fig. 20.37</a>  Using Standard Library functions to perform a heapsort.<br>
  1024. <a href="^Code::c:s0p24">Fig. 20.38</a>  Demonstrating algorithms <b>min</b> and <b>max</b>.<br>
  1025. <a href="^Illustration::c:s0p20">Fig. 20.39</a>  Algorithms not covered in this chapter.<br>
  1026. <a href="^Code::c:s0p25">Fig. 20.40</a>  Demonstrating class <b>bitset</b> and the Sieve of Eratosthenes.<br>
  1027. <a href="^Illustration::c:s0p25">Fig. 20.41</a>  Function objects in the Standard Library.<br>
  1028. <a href="^Code::c:s0p26">Fig. 20.42</a>  Demonstrating a binary function object.<br>
  1029. <br>
  1030.  
  1031. </page>
  1032. <page>
  1033. <font size=18><a href="~audio/Ch20/20fig001.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.1 - Standard Library container classes.   <img src="graphics/ch20/fig20001.gif" ></font><br>
  1034.  
  1035. </page>
  1036. <page>
  1037. <font size=18><a href="~audio/Ch20/20fig002.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.2  Common functions for all STL containers. (Part 1 of 3).</font><br>
  1038. <img src="graphics/ch20/fig2002a.gif" ><br>
  1039.  
  1040. </page>
  1041. <page>
  1042. <font size=18>Figure 20.2 - Common functions for all STL containers. (Part 2 of 3) <img src="graphics/ch20/fig2002b.gif" ></font><br>
  1043.  
  1044. </page>
  1045. <page>
  1046. <font size=18>Figure 20.2 - Common functions for all STL containers. (Part 3 of 3).  <img src="graphics/ch20/fig2002c.gif" ></font><br>
  1047.  
  1048. </page>
  1049. <page>
  1050. <font size=18><a href="~audio/Ch20/20fig003.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.3 - Standard Library container header files.     <img src="graphics/ch20/fig20003.gif" ></font><br>
  1051.  
  1052. </page>
  1053. <page>
  1054. <font size=18><a href="~audio/Ch20/20fig004.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.4 - Common <b>typedefs</b> found in first-class container. (Part 1 of 2)     <img src="graphics/ch20/fig2004a.gif" ></font><br>
  1055.  
  1056. </page>
  1057. <page>
  1058. <font size=18>Figure 20.4  Common <b>typedefs</b> found in first-class container (part 2 of 2).<img src="graphics/ch20/fig2004b.gif" ></font><br>
  1059.  
  1060. </page>
  1061. <page>
  1062. <font size=18><a href="~audio/Ch20/20fig006.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.6 - Iterator categories.   <img src="graphics/ch20/fig20006.gif" ></font><br>
  1063.  
  1064. </page>
  1065. <page>
  1066. <font size=18><a href="~audio/Ch20/20fig007.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.7 - Iterator category hierarchy.<img src="graphics/ch20/fig20007.gif" ></font><br>
  1067.  
  1068. </page>
  1069. <page>
  1070. <font size=18><a href="~audio/Ch20/20fig008.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.8 - Iterator types supported by each Standard Library container.</font><br>
  1071. <img src="graphics/ch20/fig20008.gif" ><br>
  1072.  
  1073. </page>
  1074. <page>
  1075. <font size=18><a href="~audio/Ch20/20fig010.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.10 - Iterator operations for each type of iterator. (Part 1 of 2).</font><br>
  1076. <img src="graphics/ch20/fig2010a.gif" ><br>
  1077.  
  1078. </page>
  1079. <page>
  1080. <font size=18>Figure 20.10 - Iterator operations for each type of iterator. (Part 2 of 2). </font><br>
  1081. <img src="graphics/ch20/fig2010b.gif" ><br>
  1082.  
  1083. </page>
  1084. <page>
  1085. <font size=18><a href="~audio/Ch20/20fig009.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.9 - Predefined iterator <b>typedef</b>s.<tt><b></b></tt> <img src="graphics/ch20/fig20009.gif" ></font><br>
  1086.  
  1087. </page>
  1088. <page>
  1089. <font size=18><a href="~audio/Ch20/20fig011.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.11 - Mutating-sequence algorithms.   <img src="graphics/ch20/fig20011.gif" ></font><br>
  1090.  
  1091. </page>
  1092. <page>
  1093. <font size=18><a href="~audio/Ch20/20fig012.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.12 - Non-mutating sequence algorithms. <img src="graphics/ch20/fig20012.gif" ></font><br>
  1094.  
  1095. </page>
  1096. <page>
  1097. <font size=18><a href="~audio/Ch20/20fig013.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.13 - Numerical algorithms from header file <tt><b><numeric></b></tt>.<img src="graphics/ch20/fig20013.gif" ></font><br>
  1098.  
  1099. </page>
  1100. <page>
  1101. <font size=18><a href="~audio/Ch20/20fig016.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.16 - STL exception types.  <img src="graphics/ch20/fig20016.gif" ></font><br>
  1102.  
  1103. </page>
  1104. <page>
  1105. <font size=18><a href="~audio/Ch20/20fig039.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.39 - Algorithms not covered in this chapter. (Part 1 of 5).</font><br>
  1106. <img src="graphics/ch20/fig2039a.gif" ><br>
  1107.  
  1108. </page>
  1109. <page>
  1110. <font size=18>Figure 20.39 - Algorithms not covered in this chapter. (Part 2 of 5).</font><br>
  1111. <img src="graphics/ch20/fig2039b.gif" ><br>
  1112.  
  1113. </page>
  1114. <page>
  1115. <font size=18>Figure 20.39 - Algorithms not covered in this chapter. (Part 3 of 5).</font><br>
  1116. <img src="graphics/ch20/fig2039c.gif" ><br>
  1117.  
  1118. </page>
  1119. <page>
  1120. <font size=18>Figure 20.39 - Algorithms not covered in this chapter. (Part 4 of 5).</font><br>
  1121. <img src="graphics/ch20/fig2039d.gif" ><br>
  1122.  
  1123. </page>
  1124. <page>
  1125. <font size=18>Figure 20.39 - Algorithms not covered in this chapter. (Part 5 of 5). </font><br>
  1126. <img src="graphics/ch20/fig2039e.gif" ><br>
  1127.  
  1128. </page>
  1129. <page>
  1130. <font size=18><a href="~audio/Ch20/20fig041.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 20.41 - Function objects in the Standard Library.<tt><b></b></tt> <img src="graphics/ch20/fig20041.gif" ></font><br>
  1131.  
  1132. </page>
  1133. </section>
  1134. <section type=Popup name=Answers title="Answers">
  1135. <page pagename="Answer 20.1">
  1136. <b>Answer 20.1</b><br>
  1137. False. These were avoided for performance reasons.<br>
  1138. <foreign  name="exercise" url="^Exercises::c:s0p0">
  1139.  
  1140. </page>
  1141. <page pagename="Answer 20.2">
  1142. <b>Answer 20.2</b><br>
  1143. Associative.<br>
  1144. <foreign  name="exercises" url="^Exercises::c:s0p1">
  1145.  
  1146. </page>
  1147. <page pagename="Answer 20.3">
  1148. <b>Answer 20.3</b><br>
  1149. Allocators.<br>
  1150. <foreign  name="exercises" url="">
  1151.  
  1152. </page>
  1153. <page pagename="Answer 20.4">
  1154. <b>Answer 20.4</b><br>
  1155. Input, output, forward, bidirectional, random access.<br>
  1156. <foreign  name="exercises" url="^Exercises::c:s0p3">
  1157.  
  1158. </page>
  1159. <page pagename="Answer 20.5">
  1160. <b>Answer 20.5</b><br>
  1161. False. It is actually vice versa.<br>
  1162. <foreign  name="exercises" url="^Exercises::c:s0p4">
  1163.  
  1164. </page>
  1165. <page pagename="Answer 20.6">
  1166. <b>Answer 20.6</b><br>
  1167. True.<br>
  1168. <foreign  name="exercises" url="^Exercises::c:s0p5">
  1169. <br>
  1170.  
  1171. </page>
  1172. <page pagename="Answer 20.7">
  1173. <b>Answer 20.7</b><br>
  1174. False. STL algorithms are not member functions. They operate indirectly on 
  1175. containers through iterators.<br>
  1176. <foreign  name="exercises" url="^Exercises::c:s0p6">
  1177.  
  1178. </page>
  1179. <page pagename="Answer 20.8">
  1180. <b>Answer 20.8</b><br>
  1181. True.<br>
  1182. <foreign  name="exercises" url="^Exercises::c:s0p7">
  1183.  
  1184. </page>
  1185. <page pagename="Answer 20.9">
  1186. <b>Answer 20.9</b><br>
  1187. Allocator.<br>
  1188. <foreign  name="exercises" url="^Exercises::c:s0p8">
  1189.  
  1190. </page>
  1191. <page pagename="Answer 20.10">
  1192. <b>Answer 20.10</b><br>
  1193. <b>stack</b>, <b>queue</b>, <b>priority_queue</b>.<br>
  1194. <foreign  name="exercises" url="^Exercises::c:s0p9">
  1195.  
  1196. </page>
  1197. <page pagename="Answer 20.11">
  1198. <b>Answer 20.11</b><br>
  1199. False. It actually yields the position just after the end of the container.<br>
  1200. <foreign  name="exercises" url="^Exercises::c:s0p10">
  1201.  
  1202. </page>
  1203. <page pagename="Answer 20.12">
  1204. <b>Answer 20.12</b><br>
  1205. Iterators.<br>
  1206. <foreign  name="exercises" url="^Exercises::c:s0p11">
  1207.  
  1208. </page>
  1209. <page pagename="Answer 20.13">
  1210. <b>Answer 20.13</b><br>
  1211. Random-access.<br>
  1212. <foreign  name="exercises" url="^Exercises::c:s0p12">
  1213. <br>
  1214. <br>
  1215.  
  1216. </page>
  1217. <page pagename="Answer 20.15">
  1218. <b>Answer 20.15</b><br>
  1219. The solution to this exercise can be found on your Cyber Classroom CD. Copy 
  1220. the file cpphtp2/answers/P20_15.zip to your hard drive and unzip the program 
  1221. code.<br>
  1222. <foreign  name="exercises" url="^Exercises::c:s0p15">
  1223. <br>
  1224.  
  1225. </page>
  1226. </section>
  1227. <section type=Popup name=Exercises title="Exercises">
  1228. <page pagename="Exercise 20.1">
  1229. <b>Exercise 20.1</b><br>
  1230. (T/F) The STL makes abundant use of inheritance and <b>virtual</b> functions.<br>
  1231. <foreign  name="answers" url="^Answers::c:s0p0">
  1232.  
  1233. </page>
  1234. <page pagename="Exercise 20.2">
  1235. <b>Exercise 20.2</b><br>
  1236. The two types of STL containers are sequence containers and <tt><b>________</b></tt> 
  1237. containers.<br>
  1238. <foreign  name="answers" url="^Answers::c:s0p1">
  1239.  
  1240. </page>
  1241. <page pagename="Exercise 20.3">
  1242. <b>Exercise 20.3</b><br>
  1243. STL avoids using <b>new</b> and <b>delete</b> in favor of using <tt><b>________</b></tt> to enable a 
  1244. variety of means of controlling memory allocation and deallocation.<br>
  1245. <foreign  name="answers" url="^Answers::c:s0p2">
  1246.  
  1247. </page>
  1248. <page pagename="Exercise 20.4">
  1249. <b>Exercise 20.4</b><br>
  1250. The five main iterator types are <tt><b>________</b></tt>, <tt><b>________</b></tt>, <tt><b>________</b></tt>, 
  1251. <tt><b>________</b></tt> and <tt><b>________</b></tt>.<br>
  1252. <foreign  name="answers" url="^Answers::c:s0p3">
  1253.  
  1254. </page>
  1255. <page pagename="Exercise 20.5">
  1256. <b>Exercise 20.5</b><br>
  1257. (T/F) A pointer is a generalized form of iterator.<br>
  1258. <foreign  name="answers" url="^Answers::c:s0p4">
  1259.  
  1260. </page>
  1261. <page pagename="Exercise 20.6">
  1262. <b>Exercise 20.6</b><br>
  1263. (T/F) STL algorithms can operate on C-like pointer-based arrays.<br>
  1264. <foreign  name="answers" url="^Answers::c:s0p5">
  1265.  
  1266. </page>
  1267. <page pagename="Exercise 20.7">
  1268. <b>Exercise 20.7</b><br>
  1269. (T/F) STL algorithms are encapsulated as member functions within each 
  1270. container class.<br>
  1271. <foreign  name="answers" url="^Answers::c:s0p6">
  1272.  
  1273. </page>
  1274. <page pagename="Exercise 20.8">
  1275. <b>Exercise 20.8</b><br>
  1276. (T/F) The <b>remove</b> algorithm does not decrease the size of the <b>vector</b> from which 
  1277. elements are being removed.<br>
  1278. <foreign  name="answers" url="^Answers::c:s0p7">
  1279.  
  1280. </page>
  1281. <page pagename="Exercise 20.9">
  1282. <b>Exercise 20.9</b><br>
  1283. Memory allocation and deallocation is performed in the STL with <tt><b>________</b></tt> 
  1284. objects.<br>
  1285. <foreign  name="answers" url="^Answers::c:s0p8">
  1286.  
  1287. </page>
  1288. <page pagename="Exercise 20.10">
  1289. <b>Exercise 20.10</b><br>
  1290. The three STL container adapters are <tt><b>________</b></tt>, <tt><b>________</b></tt>, and 
  1291. <tt><b>________</b></tt>.<br>
  1292. <foreign  name="answers" url="^Answers::c:s0p9">
  1293. <br>
  1294.  
  1295. </page>
  1296. <page pagename="Exercise 20.11">
  1297. <b>Exercise 20.11</b><br>
  1298. (T/F) Container member function <b>end()</b> yields the position of the last element of 
  1299. the container.<br>
  1300. <foreign  name="answers" url="^Answers::c:s0p10">
  1301. <br>
  1302.  
  1303. </page>
  1304. <page pagename="Exercise 20.12">
  1305. <b>Exercise 20.12</b><br>
  1306. STL algorithms operate on container elements indirectly using <tt><b>________</b></tt>.<br>
  1307. <foreign  name="answers" url="^Answers::c:s0p11">
  1308.  
  1309. </page>
  1310. <page pagename="Exercise 20.13">
  1311. <b>Exercise 20.13</b><br>
  1312. The <b>sort</b> algorithm requires a <tt><b>________</b></tt> iterator.<br>
  1313. <foreign  name="answers" url="^Answers::c:s0p12">
  1314. <br>
  1315.  
  1316. </page>
  1317. <page pagename="Exercise 20.13">
  1318.  
  1319. </page>
  1320. <page pagename="Exercise 20.14">
  1321. <b>Exercise 20.14</b><br>
  1322. Write a function template <b>palindrome</b> that takes as a parameter a <b>const</b> <b>vector</b> 
  1323. and returns <b>true</b> or <b>false</b> depending upon whether the <b>vector</b> does or does not 
  1324. read the same forwards as backwards (e.g., a <b>vector</b> containing 1, 2, 3, 2, 1 is a 
  1325. palindrome and a <b>vector</b> containing 1, 2, 3, 4 is not).<br>
  1326. <br>
  1327. <br>
  1328.  
  1329. </page>
  1330. <page pagename="Exercise 20.15">
  1331. <b>Exercise 20.15</b><br>
  1332. Modify the program of <a href="^Code::c:s0p15"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 20.29</a>, the Sieve of Eratosthenes, so that if the 
  1333. number the user inputs into the program is not prime, the program displays the 
  1334. prime factors of the number. Remember that a prime number's factors are only 1 
  1335. and the prime number itself. Every number that is not prime has a unique prime 
  1336. factorization. For example, consider the number 54. The factors of 54 are 2, 3, 3 
  1337. and 3. When these values are multiplied together, the result is 54. For the 
  1338. number 54, the prime factors output should be 2 and 3. <br>
  1339. <foreign  name="answers" url="^Answers::c:s0p13">
  1340. <br>
  1341.  
  1342. </page>
  1343. <page pagename="Exercise 20.16">
  1344. <b>Exercise 20.16</b><br>
  1345. Modify <a href="^Exercises::c:s0p15"><img src="bckgrnds/icons/exercise.gif" align=sidebar>Exercise 20.15</a> so that if the number the user inputs into the program is 
  1346. not prime, the program displays the prime factors of the number and the number 
  1347. of times that prime factor appears in the unique prime factorization. For 
  1348. example, the output for the number 54 should be <br>
  1349. <font size=2><br></font><font size=11><pre>
  1350. The unique prime factorization of 54 is: 2 * 3 * 3 * 3<p>
  1351. </pre></font>
  1352. <br>
  1353. <br>
  1354.  
  1355. </page>
  1356. </section>
  1357. <section type=Popup name=Practice title="Good Practices">
  1358. <page>
  1359. Use <b>typedefs</b> to make 
  1360. code with long type 
  1361. names (such as 
  1362. <b>multisets</b>) easier to 
  1363. read.<br>
  1364. <br>
  1365.  
  1366. </page>
  1367. <page>
  1368. It is a good practice to 
  1369. check if the range 
  1370. specified in a call to 
  1371. <b>min_element</b> is not 
  1372. empty or to check that 
  1373. the return value is not 
  1374. the "past the end" 
  1375. iterator. <br>
  1376. <br>
  1377.  
  1378. </page>
  1379. </section>
  1380. <section type=Popup name=Code title="Code Examples">
  1381. <page>
  1382. <font size=18>Figure 20.5  Demonstrating input and output stream iterators.</font><br>
  1383. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1384. <param  name="file" value="code/ch20/fig20_05.txt">
  1385. </applet><br>
  1386. <br>
  1387. <foreign  name="copy2disk" url="!jcpy Source/fig20_05.jar">
  1388. <foreign  name="audio" url="~audio/Ch20/20fig005.au">
  1389. <foreign  name="execute" url="!jarexe Run/fig20_05.jar">
  1390. <br>
  1391.  
  1392. </page>
  1393. <page>
  1394. <font size=18>Figure 20.14  Demonstrating Standard Library <b>vector</b> class template.</font><br>
  1395. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1396. <param  name="file" value="code/ch20/fig20_14.txt">
  1397. </applet><br>
  1398. <br>
  1399. <foreign  name="copy2disk" url="!jcpy Source/fig20_14.jar">
  1400. <foreign  name="audio" url="~audio/Ch20/20fig014.au">
  1401. <foreign  name="execute" url="!jarexe Run/fig20_14.jar">
  1402. <br>
  1403.  
  1404. </page>
  1405. <page>
  1406. <font size=18>Figure 20.15  Demonstrating Standard Library <b>vector</b> class template element-
  1407. manipulation functions.</font><br>
  1408. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1409. <param  name="file" value="code/ch20/fig20_15.txt">
  1410. </applet><br>
  1411. <br>
  1412. <foreign  name="copy2disk" url="!jcpy Source/fig20_15.jar">
  1413. <foreign  name="audio" url="~audio/Ch20/20fig015.au">
  1414. <foreign  name="execute" url="!jarexe Run/fig20_15.jar">
  1415. <br>
  1416.  
  1417. </page>
  1418. <page>
  1419. <font size=18>Figure 20.17  Demonstrating Standard Library <b>list</b> class template.</font><br>
  1420. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1421. <param  name="file" value="code/ch20/fig20_17.txt">
  1422. </applet><br>
  1423. <br>
  1424. <foreign  name="copy2disk" url="!jcpy Source/fig20_17.jar">
  1425. <foreign  name="audio" url="~audio/Ch20/20fig017.au">
  1426. <foreign  name="execute" url="!jarexe Run/fig20_17.jar">
  1427. <br>
  1428.  
  1429. </page>
  1430. <page>
  1431. <font size=18>Figure 20.18  Demonstrating Standard Library <b>deque</b> class template.</font><br>
  1432. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1433. <param  name="file" value="code/ch20/fig20_18.txt">
  1434. </applet><br>
  1435. <br>
  1436. <foreign  name="copy2disk" url="!jcpy Source/fig20_18.jar">
  1437. <foreign  name="audio" url="~audio/Ch20/20fig018.au">
  1438. <foreign  name="execute" url="!jarexe Run/fig20_18.jar">
  1439. <br>
  1440.  
  1441. </page>
  1442. <page>
  1443. <font size=18>Figure 20.19  Demonstrating Standard Library <b>multiset</b> class template.</font><br>
  1444. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1445. <param  name="file" value="code/ch20/fig20_19.txt">
  1446. </applet><br>
  1447. <br>
  1448. <foreign  name="copy2disk" url="!jcpy Source/fig20_19.jar">
  1449. <foreign  name="audio" url="~audio/Ch20/20fig019.au">
  1450. <foreign  name="execute" url="!jarexe Run/fig20_19.jar">
  1451. <br>
  1452.  
  1453. </page>
  1454. <page>
  1455. <font size=18>Figure 20.20  Demonstrating Standard Library <b>set</b> class template.</font><br>
  1456. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1457. <param  name="file" value="code/ch20/fig20_20.txt">
  1458. </applet><br>
  1459. <br>
  1460. <foreign  name="copy2disk" url="!jcpy Source/fig20_20.jar">
  1461. <foreign  name="audio" url="~audio/Ch20/20fig020.au">
  1462. <foreign  name="execute" url="!jarexe Run/fig20_20.jar">
  1463. <br>
  1464.  
  1465. </page>
  1466. <page>
  1467. <font size=18>Figure 20.21  Demonstrating Standard Library <b>multimap</b> class template.</font><br>
  1468. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1469. <param  name="file" value="code/ch20/fig20_21.txt">
  1470. </applet><br>
  1471. <br>
  1472. <foreign  name="copy2disk" url="!jcpy Source/fig20_21.jar">
  1473. <foreign  name="audio" url="~audio/Ch20/20fig021.au">
  1474. <foreign  name="execute" url="!jarexe Run/fig20_21.jar">
  1475. <br>
  1476.  
  1477. </page>
  1478. <page>
  1479. <font size=18>Figure 20.22  Demonstrating Standard Library <b>map</b> class template.</font><br>
  1480. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1481. <param  name="file" value="code/ch20/fig20_22.txt">
  1482. </applet><br>
  1483. <br>
  1484. <foreign  name="copy2disk" url="!jcpy Source/fig20_22.jar">
  1485. <foreign  name="audio" url="~audio/Ch20/20fig022.au">
  1486. <foreign  name="execute" url="!jarexe Run/fig20_22.jar">
  1487. <br>
  1488.  
  1489. </page>
  1490. <page>
  1491. <font size=18>Figure 20.23  Demonstrating Standard Library <b>stack</b> adapter class.</font><br>
  1492. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1493. <param  name="file" value="code/ch20/fig20_23.txt">
  1494. </applet><br>
  1495. <br>
  1496. <foreign  name="copy2disk" url="!jcpy Source/fig20_23.jar">
  1497. <foreign  name="audio" url="~audio/Ch20/20fig023.au">
  1498. <foreign  name="execute" url="!jarexe Run/fig20_23.jar">
  1499. <br>
  1500.  
  1501. </page>
  1502. <page>
  1503. <font size=18>Figure 20.24  Demonstrating Standard Library <b>queue</b> adapter class templates.</font><br>
  1504. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1505. <param  name="file" value="code/ch20/fig20_24.txt">
  1506. </applet><br>
  1507. <br>
  1508. <foreign  name="copy2disk" url="!jcpy Source/fig20_24.jar">
  1509. <foreign  name="audio" url="~audio/Ch20/20fig024.au">
  1510. <foreign  name="execute" url="!jarexe Run/fig20_24.jar">
  1511. <br>
  1512.  
  1513. </page>
  1514. <page>
  1515. <font size=18>Figure 20.25  Demonstrating Standard Library <b>priority_queue</b> adapter class.</font><br>
  1516. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1517. <param  name="file" value="code/ch20/fig20_25.txt">
  1518. </applet><br>
  1519. <br>
  1520. <foreign  name="copy2disk" url="!jcpy Source/fig20_25.jar">
  1521. <foreign  name="audio" url="~audio/Ch20/20fig025.au">
  1522. <foreign  name="execute" url="!jarexe Run/fig20_25.jar">
  1523. <br>
  1524.  
  1525. </page>
  1526. <page>
  1527. <font size=18>Figure 20.26  Demonstrating Standard Library functions <b>fill</b>, <b>fill_n</b>, <b>generate</b> and 
  1528. <b>generate_n</b>.</font><br>
  1529. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1530. <param  name="file" value="code/ch20/fig20_26.txt">
  1531. </applet><br>
  1532. <br>
  1533. <foreign  name="copy2disk" url="!jcpy Source/fig20_26.jar">
  1534. <foreign  name="audio" url="~audio/Ch20/20fig026.au">
  1535. <foreign  name="execute" url="!jarexe Run/fig20_26.jar">
  1536. <br>
  1537.  
  1538. </page>
  1539. <page>
  1540. <font size=18>Figure 20.27  Demonstrating Standard Library functions <b>equal</b>, <b>mismatch</b> and 
  1541. <b>lexicographical_compare</b>.</font><br>
  1542. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1543. <param  name="file" value="code/ch20/fig20_27.txt">
  1544. </applet><br>
  1545. <br>
  1546. <foreign  name="copy2disk" url="!jcpy Source/fig20_27.jar">
  1547. <foreign  name="audio" url="~audio/Ch20/20fig027.au">
  1548. <foreign  name="execute" url="!jarexe Run/fig20_27.jar">
  1549. <br>
  1550.  
  1551. </page>
  1552. <page>
  1553. <font size=18>Figure 20.28  Demonstrating Standard Library functions <b>remove</b>, <b>remove_if</b>, 
  1554. <b>remove_copy</b> and <b>remove_copy_if</b>.</font><br>
  1555. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1556. <param  name="file" value="code/ch20/fig20_28.txt">
  1557. </applet><br>
  1558. <br>
  1559. <foreign  name="copy2disk" url="!jcpy Source/fig20_28.jar">
  1560. <foreign  name="audio" url="~audio/Ch20/20fig028.au">
  1561. <foreign  name="execute" url="!jarexe Run/fig20_28.jar">
  1562. <br>
  1563.  
  1564. </page>
  1565. <page>
  1566. <font size=18>Figure 20.29  Demonstrating Standard Library functions <b>replace</b>, <b>replace_if</b>, 
  1567. <b>replace_copy</b> and <b>replace_copy_if</b>.</font><br>
  1568. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1569. <param  name="file" value="code/ch20/fig20_29.txt">
  1570. </applet><br>
  1571. <br>
  1572. <foreign  name="copy2disk" url="!jcpy Source/fig20_29.jar">
  1573. <foreign  name="audio" url="~audio/Ch20/20fig029.au">
  1574. <foreign  name="execute" url="!jarexe Run/fig20_29.jar">
  1575. <br>
  1576.  
  1577. </page>
  1578. <page>
  1579. <font size=18>Figure 20.30  Demonstrating some mathematical algorithms of the Standard 
  1580. Library.</font><br>
  1581. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1582. <param  name="file" value="code/ch20/fig20_30.txt">
  1583. </applet><br>
  1584. <br>
  1585. <foreign  name="copy2disk" url="!jcpy Source/fig20_30.jar">
  1586. <foreign  name="audio" url="~audio/Ch20/20fig030.au">
  1587. <foreign  name="execute" url="!jarexe Run/fig20_30.jar">
  1588. <br>
  1589.  
  1590. </page>
  1591. <page>
  1592. <font size=18>Figure 20.31  Basic searching and sorting algorithms of the Standard Library.</font><br>
  1593. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1594. <param  name="file" value="code/ch20/fig20_31.txt">
  1595. </applet><br>
  1596. <br>
  1597. <foreign  name="copy2disk" url="!jcpy Source/fig20_31.jar">
  1598. <foreign  name="audio" url="~audio/Ch20/20fig031.au">
  1599. <foreign  name="execute" url="!jarexe Run/fig20_31.jar">
  1600. <br>
  1601.  
  1602. </page>
  1603. <page>
  1604. <font size=18>Figure 20.32  Demonstrating <b>swap</b>, <b>iter_swap</b> and <b>swap_ranges</b>.</font><br>
  1605. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1606. <param  name="file" value="code/ch20/fig20_32.txt">
  1607. </applet><br>
  1608. <br>
  1609. <foreign  name="copy2disk" url="!jcpy Source/fig20_32.jar">
  1610. <foreign  name="audio" url="~audio/Ch20/20fig032.au">
  1611. <foreign  name="execute" url="!jarexe Run/fig20_32.jar">
  1612. <br>
  1613.  
  1614. </page>
  1615. <page>
  1616. <font size=18>Figure 20.33  Demonstrating <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse</b>.</font><br>
  1617. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1618. <param  name="file" value="code/ch20/fig20_33.txt">
  1619. </applet><br>
  1620. <br>
  1621. <foreign  name="copy2disk" url="!jcpy Source/fig20_33.jar">
  1622. <foreign  name="audio" url="~audio/Ch20/20fig033.au">
  1623. <foreign  name="execute" url="!jarexe Run/fig20_33.jar">
  1624. <br>
  1625.  
  1626. </page>
  1627. <page>
  1628. <font size=18>Figure 20.34  Demonstrating <b>inplace_merge</b>, <b>unique_copy</b> and <b>reverse_copy</b>.</font><br>
  1629. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1630. <param  name="file" value="code/ch20/fig20_34.txt">
  1631. </applet><br>
  1632. <br>
  1633. <foreign  name="copy2disk" url="!jcpy Source/fig20_34.jar">
  1634. <foreign  name="audio" url="~audio/Ch20/20fig034.au">
  1635. <foreign  name="execute" url="!jarexe Run/fig20_34.jar">
  1636. <br>
  1637.  
  1638. </page>
  1639. <page>
  1640. <font size=18>Figure 20.35  Demonstrating <b>set</b> operations of the Standard Library.</font><br>
  1641. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1642. <param  name="file" value="code/ch20/fig20_35.txt">
  1643. </applet><br>
  1644. <br>
  1645. <foreign  name="copy2disk" url="!jcpy Source/fig20_35.jar">
  1646. <foreign  name="audio" url="~audio/Ch20/20fig035.au">
  1647. <foreign  name="execute" url="!jarexe Run/fig20_35.jar">
  1648. <br>
  1649.  
  1650. </page>
  1651. <page>
  1652. <font size=18>Figure 20.36  Demonstrating <b>lower_bound</b>, <b>upper_bound</b> and <b>equal_range</b>.</font><br>
  1653. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1654. <param  name="file" value="code/ch20/fig20_36.txt">
  1655. </applet><br>
  1656. <br>
  1657. <foreign  name="copy2disk" url="!jcpy Source/fig20_36.jar">
  1658. <foreign  name="audio" url="~audio/Ch20/20fig036.au">
  1659. <foreign  name="execute" url="!jarexe Run/fig20_36.jar">
  1660. <br>
  1661.  
  1662. </page>
  1663. <page>
  1664. <font size=18>Figure 20.37  Using Standard Library functions to perform a heapsort.</font><br>
  1665. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1666. <param  name="file" value="code/ch20/fig20_37.txt">
  1667. </applet><br>
  1668. <br>
  1669. <foreign  name="copy2disk" url="!jcpy Source/fig20_37.jar">
  1670. <foreign  name="audio" url="~audio/Ch20/20fig037.au">
  1671. <foreign  name="execute" url="!jarexe Run/fig20_37.jar">
  1672. <br>
  1673.  
  1674. </page>
  1675. <page>
  1676. <font size=18>Figure 20.38  Demonstrating algorithms <b>min</b> and <b>max</b>.</font><br>
  1677. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1678. <param  name="file" value="code/ch20/fig20_38.txt">
  1679. </applet><br>
  1680. <br>
  1681. <foreign  name="copy2disk" url="!jcpy Source/fig20_38.jar">
  1682. <foreign  name="audio" url="~audio/Ch20/20fig038.au">
  1683. <foreign  name="execute" url="!jarexe Run/fig20_38.jar">
  1684. <br>
  1685.  
  1686. </page>
  1687. <page>
  1688. <font size=18>Figure 20.40  Demonstrating class <b>bitset</b> and the Sieve of Eratosthenes.</font><br>
  1689. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1690. <param  name="file" value="code/ch20/fig20_40.txt">
  1691. </applet><br>
  1692. <br>
  1693. <foreign  name="copy2disk" url="!jcpy Source/fig20_40.jar">
  1694. <foreign  name="audio" url="~audio/Ch20/20fig040.au">
  1695. <foreign  name="execute" url="!jarexe Run/fig20_40.jar">
  1696. <br>
  1697.  
  1698. </page>
  1699. <page>
  1700. Figure 20.42  Demonstrating a binary function object.<br>
  1701. <applet code=gsl.win.helper.TextBox width=580 height=300>
  1702. <param  name="file" value="code/ch20/fig20_42.txt">
  1703. </applet><br>
  1704. <br>
  1705. <foreign  name="copy2disk" url="!jcpy Source/fig20_42.jar">
  1706. <foreign  name="audio" url="~audio/Ch20/20fig042.au">
  1707. <foreign  name="execute" url="!jarexe Run/fig20_42.jar">
  1708. <br>
  1709.  
  1710. </page>
  1711. </section>
  1712. <section type=Popup name=Perform title="Performance">
  1713. <page>
  1714. Standard Library 
  1715. capabilities are 
  1716. implemented to operate 
  1717. efficiently across a 
  1718. wide variety of 
  1719. applications. For some 
  1720. applications with 
  1721. unique performance 
  1722. requirements, it may be 
  1723. necessary to write your <br>
  1724.  
  1725. </page>
  1726. <page>
  1727. own customized 
  1728. implementations.<br>
  1729. <br>
  1730.  
  1731. </page>
  1732. <page>
  1733. For any particular 
  1734. application, several 
  1735. different STL 
  1736. containers could be 
  1737. appropriate. Select the 
  1738. most appropriate 
  1739. container that achieves 
  1740. the best performance 
  1741. (i.e., balance of speed 
  1742. and size) for that <br>
  1743.  
  1744. </page>
  1745. <page>
  1746. application. Efficiency 
  1747. was a crucial 
  1748. consideration in STL's 
  1749. design.<br>
  1750. <br>
  1751.  
  1752. </page>
  1753. <page>
  1754. Know your STL 
  1755. components. Choosing 
  1756. the most appropriate 
  1757. container for a given 
  1758. problem can maximize 
  1759. performance and 
  1760. minimize memory 
  1761. requirements.<br>
  1762. <br>
  1763.  
  1764. </page>
  1765. <page>
  1766. STL generally avoids 
  1767. inheritance and <tt><b>virtual</b></tt> 
  1768. functions in favor of 
  1769. using generic 
  1770. programming with 
  1771. templates to achieve 
  1772. better execution-time 
  1773. performance.<br>
  1774. <br>
  1775.  
  1776. </page>
  1777. <page>
  1778. Insertion at the back of 
  1779. a <b>vector</b> is efficient. 
  1780. The <b>vector</b> simply 
  1781. grows if necessary to 
  1782. accommodate the new 
  1783. item. It is expensive to 
  1784. insert (or delete) an 
  1785. element in the middle 
  1786. of a <b>vector</b>--the entire 
  1787. portion of the <b>vector</b> <br>
  1788.  
  1789. </page>
  1790. <page>
  1791. after the insertion (or 
  1792. deletion) point must be 
  1793. moved, because <b>vector</b> 
  1794. elements occupy 
  1795. contiguous cells in 
  1796. memory just like a C or 
  1797. C++ "raw" array.<br>
  1798. <br>
  1799.  
  1800. </page>
  1801. <page>
  1802. Applications with 
  1803. frequent insertions and 
  1804. deletions in the middle 
  1805. and/or at the extremes 
  1806. of a container normally 
  1807. use a <b>list</b> due to its 
  1808. efficient 
  1809. implementation of 
  1810. insertion and deletion <br>
  1811.  
  1812. </page>
  1813. <page>
  1814. anywhere in the data 
  1815. structure.<br>
  1816. <br>
  1817.  
  1818. </page>
  1819. <page>
  1820. Applications that 
  1821. require frequent 
  1822. insertions and deletions 
  1823. at both ends of a 
  1824. container normally use 
  1825. a <b>deque</b> rather than a 
  1826. <b>vector</b>. Although we 
  1827. can insert and delete 
  1828. elements at the front 
  1829. and back of both a <br>
  1830.  
  1831. </page>
  1832. <page>
  1833. <b>vector</b> and a <b>deque</b>, 
  1834. class <b>deque</b> is more 
  1835. efficient than <b>vector</b> for 
  1836. doing insertions and 
  1837. deletions at the front.<br>
  1838. <br>
  1839.  
  1840. </page>
  1841. <page>
  1842. It is faster to insert 
  1843. many elements at once 
  1844. than one at a time<br>
  1845. <br>
  1846.  
  1847. </page>
  1848. <page>
  1849. Objects of class <b>vector</b> 
  1850. provide rapid indexed 
  1851. access with the 
  1852. overloaded subscript 
  1853. operator <b>[]</b> because they 
  1854. are stored in contiguous 
  1855. storage like a C or C++ 
  1856. raw array.<br>
  1857. <br>
  1858.  
  1859. </page>
  1860. <page>
  1861. Choose the <b>vector</b> 
  1862. container for the best 
  1863. random-access 
  1864. performance.<br>
  1865. <br>
  1866.  
  1867. </page>
  1868. <page>
  1869. It may be wasteful to 
  1870. automatically double 
  1871. the size of a <b>vector</b> 
  1872. when more space is 
  1873. needed. For example, a 
  1874. full <b>vector</b> of 1,000,000 
  1875. elements automatically 
  1876. resizes to accommodate 
  1877. 2,000,000 elements 
  1878. when a new element is <br>
  1879.  
  1880. </page>
  1881. <page>
  1882. added. This leaves 
  1883. 999,999 elements 
  1884. unused. Programmers 
  1885. may use <tt><b>resize()</b></tt> to 
  1886. better control space 
  1887. usage.<br>
  1888. <br>
  1889.  
  1890. </page>
  1891. <page>
  1892. Insertions and deletions 
  1893. in the middle of a 
  1894. <b>deque</b> are optimized to 
  1895. minimize the number of 
  1896. elements copied to 
  1897. maintain the illusion 
  1898. that the elements of the 
  1899. <b>deque</b> are contiguous.<br>
  1900. <br>
  1901.  
  1902. </page>
  1903. <page>
  1904. Once a storage block is 
  1905. allocated for a <b>deque</b>, 
  1906. in several 
  1907. implementations the 
  1908. block is not deallocated 
  1909. until <b>deque</b> is 
  1910. destroyed. This makes 
  1911. the operation of a 
  1912. <b>deque</b> more efficient 
  1913. than if memory were <br>
  1914.  
  1915. </page>
  1916. <page>
  1917. repeatedly allocated, 
  1918. deallocated and 
  1919. reallocated. But this 
  1920. means that the <b>deque</b> is 
  1921. more likely to use 
  1922. memory inefficiently 
  1923. (than a <b>vector</b>, for 
  1924. example).<br>
  1925. <br>
  1926.  
  1927. </page>
  1928. <page>
  1929. For performance 
  1930. reasons, <b>multisets</b> and 
  1931. <b>sets</b> are typically 
  1932. implemented as so-
  1933. called red-black binary 
  1934. search trees. With this 
  1935. internal representation, 
  1936. the binary search tree 
  1937. tends to be balanced, <br>
  1938.  
  1939. </page>
  1940. <page>
  1941. thus minimizing 
  1942. average search times.<br>
  1943. <br>
  1944.  
  1945. </page>
  1946. <page>
  1947. A <b>multimap</b> is 
  1948. implemented to 
  1949. efficiently locate all 
  1950. values paired with a 
  1951. given key.<br>
  1952. <br>
  1953.  
  1954. </page>
  1955. <page>
  1956. Each of the common 
  1957. operations of a <b>stack</b> is 
  1958. implemented as an 
  1959. <tt><b>inline </b></tt>function that 
  1960. calls the appropriate 
  1961. function of the 
  1962. underlying container. 
  1963. This avoids the 
  1964. overhead of a second 
  1965. function call.<br>
  1966.  
  1967. </page>
  1968. <page>
  1969. For the best 
  1970. performance, use class 
  1971. <b>deque</b> or <b>vector</b> as the 
  1972. underlying container 
  1973. for a <b>stack</b>.<br>
  1974. <br>
  1975.  
  1976. </page>
  1977. <page>
  1978. For the best 
  1979. performance, use class 
  1980. <b>deque</b> as the 
  1981. underlying container 
  1982. for a <b>queue</b>.<br>
  1983. <br>
  1984.  
  1985. </page>
  1986. <page>
  1987. Each of the common 
  1988. operations of a <b>queue</b> is 
  1989. implemented as an 
  1990. <b>inline</b> function that 
  1991. calls the appropriate 
  1992. function of the 
  1993. underlying container. 
  1994. This avoids the 
  1995. overhead of a second 
  1996. function call.<br>
  1997.  
  1998. </page>
  1999. <page>
  2000.  For the best 
  2001. performance, use class 
  2002. <b>vector</b> as the 
  2003. underlying container 
  2004. for a <b>priority_queue</b>.<br>
  2005. <br>
  2006.  
  2007. </page>
  2008. <page>
  2009. Each of the common 
  2010. operations of a 
  2011. <b>priority_queue</b> is 
  2012. implemented as an 
  2013. <b>inline </b>function that 
  2014. calls the appropriate 
  2015. function of the 
  2016. underlying container. 
  2017. This avoids the <br>
  2018.  
  2019. </page>
  2020. <page>
  2021. overhead of a second 
  2022. function call.<br>
  2023. <br>
  2024.  
  2025. </page>
  2026. </section>
  2027. <section type=Popup name=Objective title="Objectives">
  2028. <page>
  2029. <indent width=8 delay>*   To be able to use the templatized STL containers, container adapters and 
  2030. "near containers."</indent>
  2031. <indent width=8 delay>*   To be able to program with the dozens of STL algorithms.</indent>
  2032. <indent width=8 delay>*   To understand how algorithms use iterators to access the elements of STL 
  2033. containers.</indent>
  2034. <foreign  name="audio" url="~audio/Ch20/20obj.au">
  2035.  
  2036. </page>
  2037. <page>
  2038. <indent width=8 delay>*   To become familiar with the STL resources available on the Internet and 
  2039. the World Wide Web.</indent>
  2040. <br>
  2041.  
  2042. </page>
  2043. </section>
  2044. <section type=Popup name=Errors title="Common Errors">
  2045. <page>
  2046. Attempting to create a 
  2047. non-<b>const</b> iterator for a 
  2048. <b>const</b> container is a 
  2049. syntax error.<br>
  2050. <br>
  2051.  
  2052. </page>
  2053. <page>
  2054. Attempting to 
  2055. dereference an iterator 
  2056. positioned outside its 
  2057. container is a run-time 
  2058. logic error. In 
  2059. particular, the iterator 
  2060. returned by <tt><b>end()</b></tt> 
  2061. cannot be dereferenced.<br>
  2062. <br>
  2063.  
  2064. </page>
  2065. <page>
  2066. The <b>vector</b> must not be 
  2067. empty; otherwise, 
  2068. results of the <b>front</b> and 
  2069. <b>back</b> functions are 
  2070. undefined.<br>
  2071. <br>
  2072.  
  2073. </page>
  2074. <page>
  2075. Erasing an element that 
  2076. contains a pointer to a 
  2077. dynamically allocated 
  2078. object does not <b>delete</b> 
  2079. the object.<br>
  2080. <br>
  2081.  
  2082. </page>
  2083. <page>
  2084. Attempting to <b>sort</b> a 
  2085. container by using an 
  2086. iterator other than a 
  2087. random-access iterator 
  2088. is a syntax error. 
  2089. Function <b>sort</b> requires a 
  2090. random-access iterator.<br>
  2091. <br>
  2092.  
  2093. </page>
  2094. </section>
  2095. <section type=Popup name=Engineer title="Engineering">
  2096. <page>
  2097. The STL approach 
  2098. allows general 
  2099. programs to be written 
  2100. so that the code does 
  2101. not depend on the 
  2102. underlying container. 
  2103. Such a programming 
  2104. style is called generic 
  2105. programming.<br>
  2106. <br>
  2107.  
  2108. </page>
  2109. <page>
  2110. Avoid reinventing the 
  2111. wheel; program with 
  2112. the reusable 
  2113. components of the C++ 
  2114. Standard Library. STL 
  2115. includes many of the 
  2116. most popular data 
  2117. structures as containers 
  2118. and provides various 
  2119. popular algorithms <br>
  2120.  
  2121. </page>
  2122. <page>
  2123. programs use to process 
  2124. data in these containers.<br>
  2125. <br>
  2126.  
  2127. </page>
  2128. <page>
  2129. The equality and less 
  2130. than operators are 
  2131. technically not required 
  2132. for the elements stored 
  2133. in a container unless the 
  2134. elements need to be 
  2135. compared. However, 
  2136. when creating code 
  2137. from a template, some 
  2138. compilers require all <br>
  2139.  
  2140. </page>
  2141. <page>
  2142. parts of the template to 
  2143. be defined whereas 
  2144. other compilers require 
  2145. only the parts of the 
  2146. template that are 
  2147. actually used in the 
  2148. program.<br>
  2149. <br>
  2150.  
  2151. </page>
  2152. <page>
  2153. Using the "weakest 
  2154. iterator" that yields 
  2155. acceptable performance 
  2156. helps produce 
  2157. maximally reusable 
  2158. components<br>
  2159.  
  2160. </page>
  2161. <page>
  2162. STL is implemented 
  2163. concisely. Until now, 
  2164. class designers would 
  2165. have associated the 
  2166. algorithms with the 
  2167. containers by making 
  2168. the algorithms member 
  2169. functions of the 
  2170. containers. STL takes a 
  2171. different approach. The <br>
  2172.  
  2173. </page>
  2174. <page>
  2175. algorithms are 
  2176. separated from the 
  2177. containers and operate 
  2178. on elements of the 
  2179. containers only 
  2180. indirectly through 
  2181. iterators. This 
  2182. separation makes it 
  2183. easier to write generic 
  2184. algorithms applicable <br>
  2185.  
  2186. </page>
  2187. <page>
  2188. to many other container 
  2189. classes.<br>
  2190. <br>
  2191.  
  2192. </page>
  2193. <page>
  2194. STL algorithms can 
  2195. operate on STL 
  2196. containers and on 
  2197. pointer-based, C-like 
  2198. arrays.<br>
  2199. <br>
  2200.  
  2201. </page>
  2202. <page>
  2203. STL is extensible. It is 
  2204. straightforward to add 
  2205. new algorithms and to 
  2206. do so without changes 
  2207. to STL containers.<br>
  2208. <br>
  2209.  
  2210. </page>
  2211. <page>
  2212. Algorithms can be 
  2213. added easily to the STL 
  2214. without modifying the 
  2215. container classes.<br>
  2216. <br>
  2217.  
  2218. </page>
  2219. <page>
  2220. STL algorithms do not 
  2221. depend on the 
  2222. implementation details 
  2223. of the containers on 
  2224. which they operate. As 
  2225. long as the container's 
  2226. (or array's) iterators 
  2227. satisfy the requirements 
  2228. of the algorithm, STL 
  2229. algorithms can work on <br>
  2230.  
  2231. </page>
  2232. <page>
  2233. any C-style, pointer-
  2234. based arrays as well as 
  2235. working on STL 
  2236. containers (and user-
  2237. defined data 
  2238. structures).<br>
  2239. <br>
  2240.  
  2241. </page>
  2242. <page>
  2243. Unlike function 
  2244. pointers, a function 
  2245. object can also 
  2246. encapsulate data.<br>
  2247. <br>
  2248.  
  2249. </page>
  2250. </section>
  2251. <section type=Body name=Default title="20 Standard Template Library (STL)">
  2252. <page>
  2253. <font size=18 bold>20 Standard Template Library (STL)</font><hr>
  2254. <a href="#s1p0">20.1<spacer width=20 height=1>Introduction to the Standard Template Library 
  2255. (STL)</a>  <br>
  2256. <a href="#s2p0">20.2<spacer width=20 height=1>Sequence Containers</a>  <br>
  2257. <a href="#s3p0">20.3<spacer width=20 height=1>Associative Containers</a>  <br>
  2258. <a href="#s4p0">20.4<spacer width=20 height=1>Container Adapters</a>  <br>
  2259. <a href="#s5p0">20.5<spacer width=20 height=1>Algorithms</a>  <br>
  2260. <a href="#s6p0">20.6<spacer width=20 height=1>Class bitset</a>  <br>
  2261. <a href="#s7p0">20.7<spacer width=20 height=1>Function Objects</a>  <br>
  2262. <a href="#s8p0">20.8<spacer width=20 height=1>Summary</a>  <br>
  2263. <foreign  name="objectivesButton" url="^Objective::c:s0p0">
  2264. <foreign  name="quotes" url="^Quotes::c:s0p6">
  2265.  
  2266. </page>
  2267. <page>
  2268. <a href="#s9p0">20.9<spacer width=20 height=1>STL Resources on the Internet and the World Wide 
  2269. Web</a>  <br>
  2270. <a href="#s10p0">20.10<spacer width=20 height=1>STL Bibliography</a>  <br>
  2271. <a href="^Terminology::c:s0p0">Terminology</a>  <br>
  2272. <a href="^Illustration::c:s0p0">Figures</a>  <br>
  2273. <foreign  name="objectivesButton" url="^Objective::c:s0p0">
  2274. <foreign  name="quotes" url="^Quotes::c:s0p6">
  2275.  
  2276. </page>
  2277. </section>
  2278. <section type=Body name=Default title="20.1 Introduction to the Standard Template Library (STL)">
  2279. <page>
  2280. <font size=18 bold>20.1 Introduction to the Standard Template 
  2281. Library (STL)</font><hr>
  2282. Besides maintainability and understandability, the great 
  2283. promise of object orientation is reuse, reuse, reuse. The 
  2284. ANSI/ISO C++ draft standard includes a Standard 
  2285. Library of many reusable components. In this chapter 
  2286. we introduce the <i>Standard Template Library (STL)</i>. We 
  2287. discuss the three key components of the STL--
  2288. <i>containers</i> (popular templatized data structures), 
  2289. <i>iterators</i>, and <i>algorithms</i>. <br>
  2290. <spacer width=16 height=1>The STL was developed by Alexander Stepanov and 
  2291. Meng Lee at Hewlett-Packard. It is based on their <br>
  2292.  
  2293. </page>
  2294. <page>
  2295. research in the field of generic programming, with 
  2296. significant contributions from David Musser. The STL 
  2297. is expected to become widely used now that it has been 
  2298. accepted as part of the ANSI/ISO C++ draft standard.<br>
  2299. <spacer width=16 height=1>STL is large. Our challenge was to present it with the 
  2300. goal that the reader would be able to begin using the 
  2301. STL effectively after reading this chapter. We present a 
  2302. large portion of STL's capabilities in three dozen "live-
  2303. code" example programs. The reader will see STL "in 
  2304. action."<br>
  2305. <spacer width=16 height=1>Chapter 15 presented an introduction to data structures. 
  2306. Data structures are containers of data. In an object-
  2307. oriented world, data structures are objects that contain <br>
  2308.  
  2309. </page>
  2310. <page>
  2311. objects. The <b>Array</b> class we developed in Chapter 8 
  2312. contained objects of primitive data type <b>int</b>. After 
  2313. studying Chapter 12, "Templates," we can "templatize" 
  2314. the <b>Array</b> class to be <tt><b>Array< T ></b></tt> from which we can 
  2315. instantiate an "infinite" variety of <b>Array</b> classes such as 
  2316. <b>Array< int ></b>, <b>Array< char ></b>, <b>Array< double ></b>, or 
  2317. even arrays of non-primitive class objects such as 
  2318. <b>Array< Employee ></b>, <b>Array< SpaceCreature ></b>, 
  2319. <b>Array< InventoryItem ></b>, etc.<br>
  2320. <spacer width=16 height=1>What about other popular data structures such as lists, 
  2321. stacks, queues, priority queues, and the like? If we were 
  2322. to develop our own versions of each of these, would 
  2323. programs we write based on these class templates <br>
  2324.  
  2325. </page>
  2326. <page>
  2327. interoperate easily with other programs developed by 
  2328. programmers implementing their own versions of these 
  2329. popular data structures? Probably not. Thus, there is 
  2330. great motivation for developing a standardized library 
  2331. of templatized object  <a href="^Perform::c:s0p2"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>containers--exactly what has 
  2332. been realized with the  <a href="^Perform::c:s0p0"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>Standard Template Library 
  2333. (STL). Using  <a href="^Engineer::c:s0p0"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>STL can save considerable time and 
  2334. effort, and result in higher quality programs--precisely 
  2335. the benefits of a "world of reuse."<br>
  2336. <spacer width=16 height=1>In the 1970s, the components we used were control 
  2337. structures and functions. In the 1980s, we used classes 
  2338. primarily from a variety of platform-dependent class 
  2339. libraries. In the late 1990s with STL, we see the next <br>
  2340.  
  2341. </page>
  2342. <page>
  2343. level of componentry, namely <i>platform-independent 
  2344. class libraries</i>. We anticipate an exponential explosion 
  2345. in the number of such classes that will become available 
  2346. in the next decade.<br>
  2347. <spacer width=16 height=1>The STL is a major portion of the latest ANSI/ISO C++ 
  2348. draft standard, so the STL will be implemented by 
  2349. every major C++ compiler vendor. It is certain to be 
  2350. widely used. <br>
  2351. <spacer width=16 height=1>In C and in "raw C++" we access elements of an array 
  2352. with pointers. In C++ STL, we access elements of 
  2353. containers via iterator objects that have the "feel" of 
  2354. pointers, but "behave" more "intelligently" as we will <br>
  2355.  
  2356. </page>
  2357. <page>
  2358. see. Iterator classes are designed to be used generically 
  2359. on any container. <br>
  2360. <spacer width=16 height=1>Containers encapsulate some primitive operations, but 
  2361. the STL algorithms are implemented independent of the 
  2362. containers. <br>
  2363. <spacer width=16 height=1>STL avoids <b>new</b> and <b>delete</b> in favor of <i>allocators</i> for 
  2364. storage allocation and deallocation. The programmer 
  2365. can supply allocators to customize how a container 
  2366. handles storage management, but the default allocators 
  2367. supplied by STL are sufficient for most applications. 
  2368. Custom allocators are an advanced topic that is beyond 
  2369. the scope of this text.<br>
  2370.  
  2371. </page>
  2372. <page>
  2373. This is meant to be an introduction to the STL. It is by 
  2374. no means complete or even comprehensive. But it is a 
  2375. friendly, accessible chapter that should convince you of 
  2376. the value of the STL and encourage further study. We 
  2377. use the same "live-code approach" that we have used 
  2378. throughout the book. This may be one of the most 
  2379. important chapters in the book for you in terms of your 
  2380. appreciation of reuse, reuse, reuse. The STL containers 
  2381. include the most commonly used and most valuable 
  2382. data structures. They are all "templatized" so that you 
  2383. can tailor them to hold the type of data relevant to your 
  2384. particular applications.<br>
  2385.  
  2386. </page>
  2387. <page>
  2388. In Chapter 15, we studied  <a href="^Engineer::c:s0p1"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>data structures. We built 
  2389. linked lists, queues, stacks and trees. We carefully wove 
  2390. link objects together with pointers.  <a href="^Debug::c:s0p0"><img src="bckgrnds/icons/dbt_ico.gif" align=sidebar></a>Pointer-based code 
  2391. is complex and the slighest omission or oversight can 
  2392. lead to serious memory-access violations and memory-
  2393. leak errors. Implementing additional data structures 
  2394. such as deques, priority queues, sets, maps, etc. would 
  2395. require substantial additional work. <br>
  2396. <spacer width=16 height=1>Each STL container has associated member functions. 
  2397. Some functionality applies to all STL containers. Other 
  2398. functionality is unique to particular containers. We 
  2399. illustrate most of the common functionality with class 
  2400. templates <b>vector</b>, <b>list</b> and <b>deque</b>. We introduce <br>
  2401.  
  2402. </page>
  2403. <page>
  2404. container-specific functionality in examples for each of 
  2405. the other STL containers.<br>
  2406. <spacer width=16 height=1>We have done an extensive search for Internet/World 
  2407. Wide Web resources and have included these for you at 
  2408. the back of this chapter. We also provide an extensive 
  2409. bibliography of STL-related articles.<br>
  2410.  
  2411. </page>
  2412. <page pagename="20.1.1 Introduction to Containers">
  2413. <b>20.1.1 Introduction to Containers</b><br>
  2414. The STL container types are shown in <a href="^Illustration::c:s0p3"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 20.1</a>. The 
  2415. containers are divided into three major categories--
  2416. <i>sequence containers</i>, <i>associative containers</i> and 
  2417. <i>container adapters</i>. The sequence containers are 
  2418. sometimes referred to as <i>sequential containers</i>; we will 
  2419. normally use the term sequence containers. The 
  2420. sequence containers and associative containers are 
  2421. collectively referred to as the <i>first-class containers</i>. 
  2422. There are four other container types that are considered 
  2423. "near containers"--C-like arrays (discussed in Chapter 
  2424. 4), <b>string</b> (discussed in Chapter 19), <b>bitset</b> for 
  2425. maintaining sets of <tt><b>1</b></tt>/<tt><b>0</b></tt> flag values and <b>valarray</b> for <br>
  2426.  
  2427. </page>
  2428. <page pagename="20.1.1 Introduction to Containers">
  2429. performing high-speed mathematical vector operations 
  2430. (this class is optimized for computation performance 
  2431. and is not as flexible as the first-class containers). 
  2432. These four types are considered "near containers" 
  2433. because they exhibit similar capabilities to the first-
  2434. class containers, but do not support all the capabilities 
  2435. of first-class containers.<br>
  2436. <spacer width=16 height=1>STL has been carefully designed so that the containers 
  2437. provide similar functionality. There are many generic 
  2438. operations such as function <b>size</b> that apply to all 
  2439. containers, and other operations that apply to subsets of 
  2440. similar containers. This encourages extensibility of the 
  2441. STL with new classes. Functions common to all <br>
  2442.  
  2443. </page>
  2444. <page pagename="20.1.1 Introduction to Containers">
  2445. Standard Library containers are illustrated in <a href="^Illustration::c:s0p4"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 20.2</a>. 
  2446. [Note: Overloaded operator functions <b>operator<</b>, 
  2447. <b>operator<=</b>, <b>operator></b>, <b>operator>=</b>, <b>operator==</b> and 
  2448. <b>operator!=</b> are not provided for <tt><b>priority_queues</b></tt>.]<br>
  2449. <spacer width=16 height=1>The header files for each of the Standard Library 
  2450. containers are shown in <a href="^Illustration::c:s0p7"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 20.3</a>. The contents of these 
  2451. header files are all in <tt><b>namespace std</b></tt>. [Note: Some C++ 
  2452. compilers do not support the new-style header files. 
  2453. Many of these compilers provide their own version of 
  2454. the header file names. See your compiler 
  2455. documentation for more information on the STL 
  2456. support your compiler provides.]<br>
  2457.  
  2458. </page>
  2459. <page pagename="20.1.1 Introduction to Containers">
  2460. <a href="^Illustration::c:s0p8"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 20.4</a> shows the common <b>typedefs</b> (to create 
  2461. synonyms or aliases for types) found in first-class 
  2462. containers. These <b>typedefs</b> are used in generic 
  2463. declarations of variables, parameters to functions and 
  2464. return values from functions. For example, <b>value_type</b> 
  2465. in each container is always a <b>typedef</b> that represents the 
  2466. type of value stored in the container.<br>
  2467. When preparing to use an  <a href="^Perform::c:s0p5"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>STL container, it is 
  2468. important to ensure that the type of element being 
  2469. stored in the  <a href="^Portable::c:s0p0"><img src="bckgrnds/icons/port_ico.gif" align=sidebar></a>container supports a minimum set of 
  2470. functionality. When an element is inserted into a  
  2471. <a href="^Perform::c:s0p4"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>container, a copy of that element is made. For this 
  2472. reason, the element type should provide its own copy <br>
  2473.  
  2474. </page>
  2475. <page pagename="20.1.1 Introduction to Containers">
  2476. constructor and assignment operator. (Note: This is 
  2477. only required if default memberwise copy does not 
  2478. perform a proper copy operation for the element type.) 
  2479. Also, the associative containers and many algorithms 
  2480. require  <a href="^Engineer::c:s0p3"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>elements to be compared. For this reason, the 
  2481. element type should provide an equality operator (<b>==</b>) 
  2482. and a less than operator (<b><</b>). <br>
  2483.  
  2484. </page>
  2485. <page pagename="20.1.1 Introduction to Containers">
  2486. <b>Select the true statement(s). </b><br>
  2487. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  2488. STL container categories are sequence containers, associative containers, and container adapters. <br>
  2489. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Sequence and associative containers are referred to as first class containers.">
  2490. Container adapters are sometimes referred to as first class containers.   <br>
  2491. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  2492. STL has been carefully designed so that the containers provide similar functionality. <br>
  2493. <component type=button name=b label="Check Your Answer" width=125 height=24>
  2494.  
  2495. </page>
  2496. <page pagename="20.1.2 Introduction to Iterators">
  2497. <b>20.1.2 Introduction to Iterators</b><br>
  2498. Iterators have many features in common with pointers 
  2499. and are used to point to the elements of first-class 
  2500. containers (and for a few other purposes as we will see). 
  2501. Iterators hold state information sensitive to the 
  2502. particular containers on which they operate, thus 
  2503. iterators are implemented appropriately for each type of 
  2504. container. Nevertheless, certain iterator operations are 
  2505. uniform across containers. For example, the 
  2506. dereferencing operator (<b>*</b>) dereferences an iterator so 
  2507. you can use the element to which it points. The <tt><b>++</b></tt> 
  2508. operation on an iterator returns an iterator to the next 
  2509. element of the container (much as incrementing a <br>
  2510.  
  2511. </page>
  2512. <page pagename="20.1.2 Introduction to Iterators">
  2513. pointer into an array aims the pointer at the next 
  2514. element of the array).<br>
  2515. <spacer width=16 height=1>STL first-class containers provide member functions 
  2516. <tt><b>begin()</b></tt> and <tt><b>end()</b></tt>. Function <tt><b>begin()</b></tt> returns an iterator 
  2517. pointing to the first element of the container. Function 
  2518. <b>end()</b> returns an iterator pointing to the first element 
  2519. past the end of the container (an element that doesn't 
  2520. exist). If iterator <b>i</b> points to a particular element, then 
  2521. <b>++i</b> points to the "next" element and <b>*i</b> refers to the 
  2522. element pointed to by <b>i</b>. <br>
  2523. <spacer width=16 height=1>We use an object of type <b>iterator</b> to refer to a container 
  2524. element that can be modified. We use an object of type <br>
  2525.  
  2526. </page>
  2527. <page pagename="20.1.2 Introduction to Iterators">
  2528. <b>const_iterator</b> to refer to a container element that 
  2529. cannot be modified.<br>
  2530. <spacer width=16 height=1>We use iterators with <i>sequences</i> (also called <i>ranges</i>). 
  2531. These sequences may be in containers, or they may be 
  2532. <i>input sequences</i> or <i>output sequences</i>. The program of 
  2533. <a href="^Code::c:s0p0"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 20.5</a> demonstrates input from the standard input (a 
  2534. sequence of data for input into a program) using an 
  2535. <b>istream_iterator</b> and output to the standard output (a 
  2536. sequence of data for output from a program) using an 
  2537. <b>ostream_iterator</b>. The program inputs two integers 
  2538. from the user at the keyboard and displays the sum of 
  2539. the integers.<br>
  2540. <spacer width=16 height=1>Line 12<br>
  2541.  
  2542. </page>
  2543. <page pagename="20.1.2 Introduction to Iterators">
  2544. <font size=2><br></font><font size=11><pre>
  2545. istream_iterator< int > inputInt( cin );<p>
  2546. </pre></font>
  2547. creates an <b>istream_iterator</b> that is capable of inputting 
  2548. <tt><b>int</b></tt> values in a type-safe manner from the standard 
  2549. input object <b>cin</b>. Line 15<br>
  2550. <font size=2><br></font><font size=11><pre>
  2551. number1 = *inputInt;  <p>
  2552.     // read first int from standard input<p>
  2553. </pre></font>
  2554. dereferences iterator <b>inputInt</b> to read the first integer 
  2555. from <b>cin</b> and assigns that integer to <b>number1</b>. Notice 
  2556. the use of the dereferencing operator <b>*</b> to get the value 
  2557. from the stream associated with <b>inputInt</b>; this is similar 
  2558. to dereferencing a pointer. Line 16<br>
  2559. <font size=2><br></font><font size=11><pre>
  2560. ++inputInt;           <p>
  2561.     // move iterator to next input value<p>
  2562. </pre></font>
  2563.  
  2564. </page>
  2565. <page pagename="20.1.2 Introduction to Iterators">
  2566. positions iterator <b>inputInt</b> to the next value in the input 
  2567. stream.<br>
  2568. <font size=2><br></font><font size=11><pre>
  2569. number2 = *inputInt;  <p>
  2570.     // read next int from standard input<p>
  2571. </pre></font>
  2572. inputs the next integer from <b>inputInt</b> and assigns it to 
  2573. <b>number2</b>.<br>
  2574. <spacer width=16 height=1>Line 21<br>
  2575. <font size=2><br></font><font size=11><pre>
  2576. ostream_iterator< int > outputInt( cout );<p>
  2577. </pre></font>
  2578. creates an <b>ostream_iterator</b> that is capable of 
  2579. outputting <b>int</b> values to the standard output object <b>cout</b>. 
  2580. Line 23<br>
  2581. <font size=2><br></font><font size=11><pre>
  2582. *outputInt = number1 + number2;  // output result<p>
  2583. </pre></font>
  2584.  
  2585. </page>
  2586. <page pagename="20.1.2 Introduction to Iterators">
  2587. outputs an integer to <b>cout</b> by assigning to <b>*outputInt</b> 
  2588. the sum of <b>number1</b> and <b>number2</b>. Notice the use of 
  2589. the  <a href="^Debug::c:s0p4"><img src="bckgrnds/icons/dbt_ico.gif" align=sidebar></a>dereferencing operator <b>*</b> to use <b>*outputInt</b> as an 
  2590. <i>lvalue</i> in the assignment statement. If you want to 
  2591. output another value using <b>outputInt</b>, the  <a href="^Errors::c:s0p1"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>iterator must 
  2592. be incremented with <b>++</b> (both preincrement and 
  2593. postincrement can be used).<br>
  2594. <spacer width=16 height=1><a href="^Illustration::c:s0p10"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 20.6</a> shows the categories of iterators used by 
  2595. the STL. Each category provides a specific set of 
  2596. functionality. <br>
  2597. <spacer width=16 height=1><a href="^Illustration::c:s0p11"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 20.7</a> illustrates the hierarchy of  <a href="^Errors::c:s0p0"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>iterator 
  2598. categories. As you follow the hierarchy from top to 
  2599. bottom, each iterator category supports all the <br>
  2600.  
  2601. </page>
  2602. <page pagename="20.1.2 Introduction to Iterators">
  2603. functionality of the categories above it in the figure. 
  2604. Thus the "weakest" iterator types are at the top and the 
  2605. most powerful iterator type is at the bottom. Note that 
  2606. this is not an inheritance hierarchy.<br>
  2607. The category of iterator supported by each container 
  2608. determines whether that container can be used with 
  2609. specific algorithms in the STL. Containers that support 
  2610. random-access iterators can be used with all algorithms 
  2611. in the STL. As we will see, pointers into arrays may be 
  2612. used in place of iterators in most STL algorithms, 
  2613. including those that require random-access iterators. 
  2614. <a href="^Illustration::c:s0p12"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 20.8</a> shows the category of  <a href="^Engineer::c:s0p5"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>iterator supported by 
  2615. each of the STL containers. Note that only <b>vectors</b>, <br>
  2616.  
  2617. </page>
  2618. <page pagename="20.1.2 Introduction to Iterators">
  2619. <b>deques</b>, <b>lists</b>, <b>sets</b>, <b>multisets</b>, <b>maps</b> and <b>multimaps</b> 
  2620. (i.e., the first-class containers) are traversable with 
  2621. iterators.<br>
  2622. <spacer width=16 height=1>.<a href="^Illustration::c:s0p15"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 20.9</a> shows the predefined iterator <b>typedefs</b> that 
  2623. are found in the class definitions of the STL containers. 
  2624. Not every <b>typedef</b> is defined for every container. We 
  2625. use <b>const</b> versions of the  <a href="^Debug::c:s0p5"><img src="bckgrnds/icons/dbt_ico.gif" align=sidebar></a>iterators for traversing read-
  2626. only containers. We use reverse iterators to traverse 
  2627. containers in the reverse direction.<br>
  2628. <spacer width=16 height=1><a href="^Illustration::c:s0p13"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 20.10</a> shows the operations that can be 
  2629. performed on each iterator type. Note that the 
  2630. operations for each iterator type include all operations 
  2631. preceding that type in the figure. Note also that for <br>
  2632.  
  2633. </page>
  2634. <page pagename="20.1.2 Introduction to Iterators">
  2635. input iterators and output iterators it is not possible to 
  2636. save the iterator, then use the saved value later.<br>
  2637.  
  2638. </page>
  2639. <page pagename="20.1.2 Introduction to Iterators">
  2640. <b>Select the true statement(s). </b><br>
  2641. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  2642. STL first class containers provide member functions begin and end. <br>
  2643. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Containers that support random access iterators can be used with all STL algorithms.">
  2644. Containers that support random access iterators can be used with a limited number of STL algorithms.   <br>
  2645. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. An iterator can modify the container element, so it must refer to a modifiable element.">
  2646. An object of type iterator is capable of referring to a container element that cannot be modified. <br>
  2647. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  2648. Output to the standard output can be accomplished with ostream_iterator.  <br>
  2649. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  2650. Iterators may be dereferenced. <br>
  2651. <component type=button name=b label="Check Your Answer" width=125 height=24>
  2652.  
  2653. </page>
  2654. <page pagename="20.1.3 Introduction to Algorithms ">
  2655. <b>20.1.3 Introduction to Algorithms </b><br>
  2656. A crucial aspect of the STL is that it provides 
  2657. algorithms that can be used generically across a variety 
  2658. of containers. STL provides many algorithms you will 
  2659. use frequently to manipulate containers. Inserting, 
  2660. deleting, searching, sorting and others are appropriate 
  2661. for some or all of the STL containers.<br>
  2662. <spacer width=16 height=1>STL includes approximately 70 standard algorithms. 
  2663. We provide live-code examples of most of these and 
  2664. summarize the others in tables. The algorithms operate 
  2665. on the elements of containers only indirectly through 
  2666. iterators. Many algorithms operate on sequences of 
  2667. elements defined by pairs of iterators--a first iterator <br>
  2668.  
  2669. </page>
  2670. <page pagename="20.1.3 Introduction to Algorithms ">
  2671. pointing to the first element of the sequence and a 
  2672. second iterator pointing to one element past the last 
  2673. element of the sequence.<br>
  2674. <spacer width=16 height=1>Container member function <tt><b>begin()</b></tt> returns an iterator 
  2675. to the first element of a container; <tt><b>end()</b></tt> returns an 
  2676. iterator to the first position past the last element of a 
  2677. container.  <a href="^Engineer::c:s0p6"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>Algorithms often return iterators.<br>
  2678. <spacer width=16 height=1>An algorithm like <tt><b>find()</b></tt>, for example, locates an 
  2679. element and returns an iterator to that element. If the 
  2680. element is not found, <b>find()</b> returns the <tt><b>end()</b></tt> iterator 
  2681. (which may be tested to determine if an element was 
  2682. not found). The <b>find()</b> algorithm can be used with each 
  2683. of the STL containers.<br>
  2684.  
  2685. </page>
  2686. <page pagename="20.1.3 Introduction to Algorithms ">
  2687. STL  <a href="^Engineer::c:s0p10"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>algorithms create yet another opportunity for 
  2688. reuse. Using the rich collection of popular algorithms 
  2689. can save programmers much time and effort.<br>
  2690. <spacer width=16 height=1>If an algorithm uses less powerful iterators, it may also 
  2691. be used with containers that support more powerful 
  2692. iterators. Some  <a href="^Engineer::c:s0p9"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>algorithms demand powerful iterators; 
  2693. e.g., sort demands random-access  <a href="^Portable::c:s0p1"><img src="bckgrnds/icons/port_ico.gif" align=sidebar></a>iterators.<br>
  2694. <spacer width=16 height=1><a href="^Illustration::c:s0p16"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 20.11</a> shows many of the <i>mutating-sequence 
  2695. algorithms</i>--i.e., the algorithms that result in 
  2696. modifications of the containers to which the algorithms 
  2697. are applied.<br>
  2698. <spacer width=16 height=1><a href="^Illustration::c:s0p17"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 20.12</a> shows many of the nonmutating sequence 
  2699. algorithms--i.e., the algorithms that do not result in <br>
  2700.  
  2701. </page>
  2702. <page pagename="20.1.3 Introduction to Algorithms ">
  2703. modifications of the containers to which the algorithms 
  2704. are applied.<br>
  2705. <spacer width=16 height=1><a href="^Illustration::c:s0p18"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 20.13</a> shows the numerical algorithms of the 
  2706. header file <b><numeric></b>.<br>
  2707.  
  2708. </page>
  2709. <page pagename="20.1.3 Introduction to Algorithms ">
  2710. <b>Select the true statement(s). </b><br>
  2711. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  2712. Mutating-sequence algorithms modify the containers to which the algorithms are applied.  <br>
  2713. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  2714. Numeric algorithms are contained in <numeric>.  <br>
  2715. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Algorithms often return iterators.">
  2716. An algorithm cannot return an iterator.   <br>
  2717. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  2718. STL provides approximately 70 standard algorithms that can be used generically across a variety of containers. <br>
  2719. <component type=button name=b label="Check Your Answer" width=125 height=24>
  2720.  
  2721. </page>
  2722. </section>
  2723. <section type=Body name=Default title="20.2 Sequence Containers">
  2724. <page>
  2725. <font size=18 bold>20.2 Sequence Containers</font><hr>
  2726. The C++ Standard Template Library provides three 
  2727. sequence containers--<b>vector</b>, <b>list</b> and <b>deque</b>. Class 
  2728. <b>vector</b> and class <b>deque</b> both are based on arrays. Class 
  2729. <b>list</b> implements a linked-list data structure similar to our 
  2730. <b>List</b> class presented in Chapter 15, but more robust.<br>
  2731. <spacer width=16 height=1>One of the most popular containers in the STL is 
  2732. <b>vector</b>. Class <b>vector</b> is a refinement of the kind of 
  2733. "smart" <b>Array</b> class we created in Chapter 8. A <b>vector</b> 
  2734. can change size dynamically. Unlike C and C++ "raw" 
  2735. arrays (see Chapter 4), <b>vectors</b> can be assigned to one 
  2736. another. This is not possible with pointer-based, C-like <br>
  2737.  
  2738. </page>
  2739. <page>
  2740. arrays because those array names are constant pointers 
  2741. and cannot be the targets of assignments. Just as with C 
  2742. arrays,  <b>vector</b> <b><a href="^Perform::c:s0p6"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a></b>subscripting does not perform automatic 
  2743. range checking, but class <b>vector</b> does provide this 
  2744. capability (as we will see) via member function <b>at</b>. <br>
  2745. <a href="^Illustration::c:s0p4"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 20.2</a> presented the operations common to all the 
  2746. STL containers. Beyond these operations, each 
  2747. container typically provides a variety of other 
  2748. capabilities. Many of these capabilities are common to 
  2749. several containers. However, these operations are not 
  2750. always equally efficient for each container. 
  2751. Programmers must often choose the  <a href="^Perform::c:s0p10"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>container most 
  2752. appropriate for their application. <br>
  2753.  
  2754. </page>
  2755. <page>
  2756. In addition to the common operations described in <a href="^Illustration::c:s0p4"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 
  2757. 20.2</a>, the sequence containers have several other 
  2758. common operations--<b>front</b> to return a reference to the 
  2759. first element in the  <a href="^Perform::c:s0p8"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>container, <b>back</b> to return a 
  2760. reference to the last element in the container, 
  2761. <b>push_back</b> to insert a new element at the end of the 
  2762. container and <b>pop_back</b> to remove the last element of 
  2763. the container. <br>
  2764.  
  2765. </page>
  2766. <page>
  2767. <b>Select the true statement(s). </b><br>
  2768. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  2769. vector, list, and deque are sequence containers.  <br>
  2770. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. vectors can be assigned to each other.">
  2771. Like any array, vectors cannot be assigned to each other.   <br>
  2772. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. vector subscripting does not provide range checking, but function  of class vector does.">
  2773. vector subscripting with operator [] provides range checking.at <br>
  2774. <component type=button name=b label="Check Your Answer" width=125 height=24>
  2775.  
  2776. </page>
  2777. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2778. <b>20.2.1<tt> <b>vector</b></tt> Sequence Container</b><br>
  2779. Class <b>vector</b> provides a data structure with contiguous 
  2780. memory locations. This enables efficient, direct access 
  2781. to any element of a vector via the subscript operator <b>[]</b> 
  2782. exactly like a C or C++ "raw" array. <b><a href="^Perform::c:s0p14"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a></b>Class  <b>vector</b> is 
  2783. most commonly used when the data in the container 
  2784. must be sorted and easily accessible via a subscript. 
  2785. When a <b>vector's</b> memory is exhausted, the <b>vector</b> 
  2786. automatically allocates a larger  <a href="^Perform::c:s0p13"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>contiguous area of 
  2787. memory, copies the original  <a href="^Perform::c:s0p12"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>elements into the new 
  2788. memory and deallocates the old memory.<br>
  2789. <spacer width=16 height=1> An important part of every container is the type of 
  2790. iterator it supports. This determines which algorithms <br>
  2791.  
  2792. </page>
  2793. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2794. can be applied to the container. A <b>vector</b> supports 
  2795. random-access iterators--i.e., all iterator operations 
  2796. shown in <a href="^Illustration::c:s0p13"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 20.10</a> can be applied to a <b>vector</b> iterator. 
  2797. All STL algorithms can operate on a <b>vector</b>. The 
  2798. iterators for a <b>vector</b> are normally implemented as 
  2799. pointers to elements of the <b>vector</b>. Each of the STL 
  2800. algorithms that take iterator arguments requires those 
  2801. iterators to provide a minimum level of functionality. If 
  2802. an algorithm requires a forward iterator, for example, 
  2803. that algorithm can operate on any container that 
  2804. provides forward iterators, bidirectional iterators or 
  2805. random-access iterators. As long as the container 
  2806. supports the algorithm's minimum iterator <br>
  2807.  
  2808. </page>
  2809. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2810. functionality, the algorithm can operate on the 
  2811. container. <br>
  2812. <spacer width=16 height=1><a href="^Code::c:s0p1"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.14</a> illustrates several functions of the <b>vector</b> 
  2813. class template. Many of these functions are available in 
  2814. every Standard Library first-class container. You must 
  2815. include header file <tt><b><vector></b></tt> to use class <b>vector</b>.<br>
  2816. Line 15<br>
  2817. <font size=2><br></font><font size=11><pre>
  2818. vector< int > v;<p>
  2819. </pre></font>
  2820. declares an instance called <b>v</b> of class <b>vector</b> that stores 
  2821. <b>int</b> values. When this object is instantiated, an empty 
  2822. <b>vector</b> is created with a size of 0 (i.e., the number of 
  2823. elements stored in the <b>vector</b>) and a capacity of 0 (i.e., <br>
  2824.  
  2825. </page>
  2826. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2827. the number of elements that can be stored without 
  2828. allocating more memory to the <b>vector</b>).<br>
  2829. <spacer width=16 height=1>Lines 17 and 18<br>
  2830. <font size=2><br></font><font size=11><pre>
  2831. cout << "The initial size of v is: " << v.size()<p>
  2832.      << "\nThe initial capacity of v is: " <p>
  2833.      << v.capacity();<p>
  2834. </pre></font>
  2835. demonstrate the <tt><b>size</b></tt> and <tt><b>capacity</b></tt> functions that 
  2836. both initially return 0 for <b>vector v</b> in this example. 
  2837. Function <b>size</b>--available in every container--returns 
  2838. the number of elements currently stored in the 
  2839. container. Function <b>capacity</b> returns the number of 
  2840. elements that can be stored in the <b>vector</b> before the <br>
  2841.  
  2842. </page>
  2843. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2844. <b>vector</b> dynamically resizes itself to accommodate more 
  2845. elements.<br>
  2846. <spacer width=16 height=1>Lines 19 through 21<br>
  2847. <font size=2><br></font><font size=11><pre>
  2848. v.push_back( 2 );  // method push_back() is in<p>
  2849. v.push_back( 3 );  // every sequence container<p>
  2850. v.push_back( 4 );<p>
  2851. </pre></font>
  2852. use function <b>push_back</b>--available in all sequence 
  2853. containers--to add an element to the end of the <b>vector</b> 
  2854. (i.e., the next available position). If an element is added 
  2855. to a full <b>vector</b>, the <b>vector</b> increases its size  
  2856. <a href="^Perform::c:s0p15"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>automatically--some STL implementations have the 
  2857. <b>vector</b> double its size automatically.<br>
  2858.  
  2859. </page>
  2860. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2861. Lines 22 and 23 use <b>size</b> and <b>capacity</b> to illustrate the 
  2862. new size and capacity of the <b>vector</b> after the 
  2863. <b>push_back</b> operations. Function <b>size</b> returns 3--the 
  2864. number of elements added to the <b>vector</b>. Function 
  2865. <b>capacity</b> returns 4 indicating that we can add one more 
  2866. element without allocating more memory for the 
  2867. <b>vector</b>. When we added the first element, the size of <b>v</b> 
  2868. became 1 and the capacity of <b>v</b> became 1. When we 
  2869. added the second element, the size of <b>v</b> became 2 and 
  2870. the capacity of <b>v</b> became 2. When we added the third 
  2871. element, the size of <b>v</b> became 3 and the capacity of <b>v</b> 
  2872. became 4. If we add two more elements, the size of <b>v</b> 
  2873. would be 5 and the capacity would be 8. The capacity <br>
  2874.  
  2875. </page>
  2876. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2877. doubles each time the total space allocated to the <b>vector</b> 
  2878. is full and another element is added.<br>
  2879. <spacer width=16 height=1>Lines 26 and 27 demonstrate how to output the contents 
  2880. of an array using pointers and pointer arithmetic. Line 
  2881. 30 calls function <b>printVector</b> to output the contents of 
  2882. a <b>vector</b> using iterators. The definition of function 
  2883. template <b>printVector</b> begins at line 43. The function 
  2884. receives a <b>const</b> reference to a <b>vector</b> as its argument. 
  2885. Line 46<br>
  2886. <font size=2><br></font><font size=11><pre>
  2887. vector< T >::const_iterator p1;<p>
  2888. </pre></font>
  2889. declares a <b>const_iterator</b> called <b>p1</b> that iterates through 
  2890. the <b>vector</b> and outputs its contents. A <b>const_iterator</b> 
  2891. enables the program to read the elements of the <b>vector</b>, <br>
  2892.  
  2893. </page>
  2894. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2895. but does not allow the program to modify the elements. 
  2896. The <tt><b>for</b></tt> structure at lines 48 and 49<br>
  2897. <font size=2><br></font><font size=11><pre>
  2898. for ( p1 = vec.begin(); p1 != vec.end(); p1++ )<p>
  2899.    cout << *p1 << ' ';<p>
  2900. </pre></font>
  2901. initializes <b>p1</b> using <b>vector</b> member function <b>begin</b> that 
  2902. returns a <b>const_iterator</b> to the first element in the 
  2903. <b>vector</b> (there is another version of <b>begin</b> that returns an 
  2904. <b>iterator</b> that can be used for non-<b>const</b> containers). The 
  2905. loop continues as long as <b>p1</b> is not past the end of the 
  2906. <b>vector</b>. This is determined by comparing <b>p1</b> to the 
  2907. result of <b>vec.end()</b> that returns a <b>const_iterator</b> (as 
  2908. with <b>begin</b>, there is another version of <b>end</b> that returns 
  2909. an <b>iterator</b>) indicating the location after the last <br>
  2910.  
  2911. </page>
  2912. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2913. element of the <b>vector</b>. If <b>p1</b> is equal to this value, the 
  2914. end of the <b>vector</b> has been reached. Functions <b>begin</b> 
  2915. and <b>end</b> are available for all first-class containers. The 
  2916. body of the loop dereferences  <a href="^Debug::c:s0p7"><img src="bckgrnds/icons/dbt_ico.gif" align=sidebar></a>iterator <b>p1</b> to get the 
  2917. value in the current element of the <b>vector</b>. The 
  2918. expression <b>p1++</b> positions the iterator to the next 
  2919. element of the <b>vector</b>.<br>
  2920. <spacer width=16 height=1>Line 34<br>
  2921. <font size=2><br></font><font size=11><pre>
  2922. vector< int >::reverse_iterator p2;<p>
  2923. </pre></font>
  2924. declares a <b>reverse_iterator</b> that can be used to iterate 
  2925. through a <b>vector</b> backwards. All first-class containers 
  2926. support this type of iterator. <br>
  2927. <spacer width=16 height=1>Lines 36 and 37<br>
  2928.  
  2929. </page>
  2930. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2931. <font size=2><br></font><font size=11><pre>
  2932. for ( p2 = v.rbegin(); p2 != v.rend(); p2++ )<p>
  2933. </pre></font>
  2934. <font size=2><br></font><font size=11><pre>
  2935.    cout << *p2 << ' ';<p>
  2936. </pre></font>
  2937. use a <b>for</b> structure similar to that in function 
  2938. <b>printVector</b> to iterate through the <b>vector</b>. In this loop, 
  2939. functions <b>rbegin</b> (i.e., the iterator for the starting point 
  2940. for iterating in reverse through the container) and <b>rend</b> 
  2941. (i.e., the iterator for the ending point for iterating in 
  2942. reverse through the container) delineate the range of 
  2943. elements to output in reverse. As with functions <b>begin</b> 
  2944. and <b>end</b>, <b>rbegin</b> and <b>rend</b> can return a 
  2945. <b>const_reverse_iterator</b> or a <b>reverse_iterator</b> based on 
  2946. whether or not the container is constant.<br>
  2947.  
  2948. </page>
  2949. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2950. <a href="^Code::c:s0p2"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.15</a> illustrates functions that enable retrieval 
  2951. and manipulation of the elements of a <b>vector</b>. Line 14<br>
  2952. <font size=2><br></font><font size=11><pre>
  2953. vector< int > v( a, a + SIZE );<p>
  2954. </pre></font>
  2955. uses an overloaded <b>vector</b> constructor that takes two 
  2956. iterators as arguments. Remember that pointers into an 
  2957. array can be used as iterators. This statement creates 
  2958. integer <b>vector v</b> and initializes it with the contents of 
  2959. integer array <tt><b>a</b></tt> from location <tt><b>a</b></tt> up to--but not 
  2960. including--location <b>a + SIZE</b>.<br>
  2961. Line 15<br>
  2962. <font size=2><br></font><font size=11><pre>
  2963. ostream_iterator< int > output( cout, " " );<p>
  2964. </pre></font>
  2965.  
  2966. </page>
  2967. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2968. declares an <b>ostream_iterator</b> called <b>output</b> that can be 
  2969. used to output integers separated by single spaces via 
  2970. <b>cout</b>. An <b>ostream_iterator</b> is a type-safe output 
  2971. mechanism that will output only values of type <b>int</b> or a 
  2972. compatible type. The first argument to the constructor 
  2973. specifies the output stream and the second argument is a 
  2974. string specifying separator characters for the values 
  2975. output--in this case a space character. We will use the 
  2976. <b>ostream_iterator</b> to output the contents of the <b>vector</b> 
  2977. in this example.<br>
  2978. <spacer width=16 height=1>Line 18<br>
  2979. <font size=2><br></font><font size=11><pre>
  2980. copy( v.begin(), v.end(), output );<p>
  2981. </pre></font>
  2982.  
  2983. </page>
  2984. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  2985. uses algorithm <b>copy</b> from the Standard Library to 
  2986. output the entire contents of <b>vector v</b> to the standard 
  2987. output. Algorithm <b>copy</b> copies each element in the 
  2988. container starting with the location specified by the 
  2989. iterator in its first argument and up to--but not 
  2990. including--the location specified by the iterator in its 
  2991. second argument. The first and second arguments must 
  2992. satisfy input iterator requirements--i.e., iterators 
  2993. through which values can be read from a container. The 
  2994. elements are copied to the location specified by the 
  2995. output iterator (i.e., an iterator through which a value 
  2996. can be stored or output) specified as the last argument. 
  2997. In this case, the output iterator is <b>ostream_iterator</b> <br>
  2998.  
  2999. </page>
  3000. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  3001. <b>output</b> that is attached to <b>cout</b>, so the elements are 
  3002. copied to the standard output. To use the algorithms of 
  3003. the Standard Library, you must include the header file 
  3004. <tt><b><algorithm></b></tt>.<br>
  3005. <spacer width=16 height=1>Lines 20 and 21 use functions <b>front</b> and <b>back</b> 
  3006. (available for all sequence containers) to determine the 
  3007. first and last <b><a href="^Errors::c:s0p2"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a></b>element of the  <b>vector</b>, respectively. <br>
  3008. <spacer width=16 height=1>Lines 23 and 24<br>
  3009. <font size=2><br></font><font size=11><pre>
  3010. v[ 0 ] = 7;      <p>
  3011.     // set first element to 7<p>
  3012. v.at( 2 ) = 10;  <p>
  3013.     // set element at position 2 to 10<p>
  3014. </pre></font>
  3015.  
  3016. </page>
  3017. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  3018. illustrate two ways to subscript through a <b>vector</b> (these 
  3019. also can be used with the <b>deque</b> containers). Line 23 
  3020. uses the subscript operator that is overloaded to return 
  3021. either a reference to the value at the specified location 
  3022. or a constant reference to that value depending on 
  3023. whether or not the container is constant. Function <b>at</b> 
  3024. performs the same operation with one additional 
  3025. feature--bounds checking. Function <b>at</b> first checks the 
  3026. value supplied as an argument and determines if it is in 
  3027. the bounds of the <b>vector</b>. If not, function <b>at</b> throws an 
  3028. <b>out_of_bounds</b> exception (as demonstrated in lines 29 
  3029. through 34). Some of the STL exception types are 
  3030. shown in <a href="^Illustration::c:s0p19"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 20.16</a> (the Standard Library exception <br>
  3031.  
  3032. </page>
  3033. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  3034. types are discussed in Chapter 13, "Exception 
  3035. Handling").<br>
  3036. <spacer width=16 height=1>Line 25<br>
  3037. <font size=2><br></font><font size=11><pre>
  3038. v.insert( v.begin() + 1, 22 );  <p>
  3039.     // insert 22 as 2nd element<p>
  3040. </pre></font>
  3041. uses one of the three <b>insert</b> functions that are available 
  3042. to each sequence container. The preceding statement 
  3043. inserts the value 22 before the element at the location 
  3044. specified by the iterator in the first argument. In this 
  3045. example, the iterator is pointing to the second element 
  3046. of the <b>vector</b>, so 22 is inserted as the second element 
  3047. and the original second element becomes the third 
  3048. element of the <b>vector</b>. The other versions of <b>insert</b> <br>
  3049.  
  3050. </page>
  3051. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  3052. allow inserting multiple copies of the same value 
  3053. starting at a particular position in the container or 
  3054. inserting a range of values from another container (or 
  3055. array) starting at a particular position in the original 
  3056. container.<br>
  3057. <spacer width=16 height=1>Lines 36 and 39 <br>
  3058. <font size=2><br></font><font size=11><pre>
  3059. v.erase( v.begin() );<p>
  3060. v.erase( v.begin(), v.end() );<p>
  3061. </pre></font>
  3062. use the two <b>erase</b> functions that are available in all 
  3063. first-class containers. Line 36 indicates that the element 
  3064. at the location specified by the iterator argument should 
  3065. be removed from the container (in this example the 
  3066. element at the beginning of the <b>vector</b>). Line 39 <br>
  3067.  
  3068. </page>
  3069. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  3070. specifies that all elements in the range starting with the 
  3071. location of the first argument up to--but not 
  3072. including--the location of the second argument should 
  3073. be erased from the container. In this example, all the  
  3074. <a href="^Errors::c:s0p3"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>elements are erased from the <b>vector</b>. Line 41 uses 
  3075. function <b>empty</b> (available for all containers including 
  3076. the adapters) to confirm that the <b>vector</b> is empty.<br>
  3077. <spacer width=16 height=1>Line 43<br>
  3078. <font size=2><br></font><font size=11><pre>
  3079. v.insert( v.begin(), a, a + SIZE );<p>
  3080. </pre></font>
  3081. uses the version of function <b>insert</b> that uses the second 
  3082. and third argument to specify the starting location and 
  3083. ending location in a sequence of values (possibly from 
  3084. another container, but in this case from integer array <b>a</b>) <br>
  3085.  
  3086. </page>
  3087. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  3088. that should be inserted into the <b>vector</b>. Remember that 
  3089. the ending location specifies the position in the 
  3090. sequence after the last element to be inserted; copying 
  3091. is performed up to--but not including--this location.<br>
  3092. <spacer width=16 height=1>Finally, line 44<br>
  3093. <font size=2><br></font><font size=11><pre>
  3094. v.clear();  <p>
  3095.     // clear calls erase to empty a container<p>
  3096. </pre></font>
  3097. uses function <b>clear</b> (available in all first-class 
  3098. containers) to empty the <b>vector</b>. This function calls the 
  3099. version of <b>erase</b> used in line 39 to actually perform the 
  3100. operation.<br>
  3101. <spacer width=16 height=1>Note: There are other functions that are common to all 
  3102. containers and common to all sequence containers that <br>
  3103.  
  3104. </page>
  3105. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  3106. have not been covered yet. We will cover most of these 
  3107. in the next few sections. We will also cover many 
  3108. functions that are specific to each container.<br>
  3109.  
  3110. </page>
  3111. <page pagename="20.2.1<tt> <b>vector</b></tt> Sequence Container">
  3112. <b>Select the true statement(s). </b><br>
  3113. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3114. Class vector is a data structure with contiguous memory locations.  <br>
  3115. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3116. A vector grows on its own (i.e., allocates new memory when necessary).  <br>
  3117. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. vectors are not part of  but are defined in <vector>.">
  3118. vectors do not need a separate include file as they are contained in <iostream>.<iostream>   <br>
  3119. <component type=button name=b label="Check Your Answer" width=125 height=24>
  3120.  
  3121. </page>
  3122. <page pagename="20.2.2<tt> <b>list</b></tt> Sequence Container">
  3123. <b>20.2.2<tt> <b>list</b></tt> Sequence Container</b><br>
  3124. The <b>list</b> sequence container provides an efficient 
  3125. implementation for insertion and deletion operations at 
  3126. any location in the container. If most of the insertions 
  3127. and deletions occur at the ends of the container, the 
  3128. <b>deque</b> data structure (<a href="#s2p35">Section 20.2.3</a>) provides a more 
  3129. efficient implementation. Class <b>list</b> is implemented as a 
  3130. doubly-linked list--i.e., every node in the <b>list</b> contains 
  3131. a pointer to the previous node in the <b>list</b> and the next 
  3132. node in the <b>list</b>. This enables class <b>list</b> to support 
  3133. bidirectional iterators that allow the container to be 
  3134. traversed both forwards and backwards. Any algorithm 
  3135. that requires input, output, forward or bidirectional <br>
  3136.  
  3137. </page>
  3138. <page pagename="20.2.2<tt> <b>list</b></tt> Sequence Container">
  3139. iterators can operate on a <b>list</b>. Many of the <b>list</b> member 
  3140. functions manipulate the elements of the container as an 
  3141. ordered set of elements.<br>
  3142. <spacer width=16 height=1>In addition to the member functions of all STL 
  3143. containers in <a href="^Illustration::c:s0p4"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 20.2</a> and the common member 
  3144. functions of all sequence containers discussed in 
  3145. <a href="#s5p0">Section 20.5</a>, class <b>list</b> provides eight other member 
  3146. functions--<b>splice</b>, <b>push_front</b>, <b>pop_front</b>, <b>remove</b>, 
  3147. <b>unique</b>, <b>merge</b>, <b>reverse</b> and <b>sort</b>. <a href="^Code::c:s0p3"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.17</a> 
  3148. demonstrates several features of class <b>list</b>. Remember 
  3149. that many of the functions presented in <a href="^Code::c:s0p1"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figs. 20.14</a> and  
  3150. <a href="^Code::c:s0p2"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>20.15</a> can be used with class <b>list</b>. Header file <b><list></b> 
  3151. must be included to use class <b>list</b>.<br>
  3152.  
  3153. </page>
  3154. <page pagename="20.2.2<tt> <b>list</b></tt> Sequence Container">
  3155. Line 16<br>
  3156. <font size=2><br></font><font size=11><pre>
  3157. list< int > values, otherValues;<p>
  3158. </pre></font>
  3159. instantiates two <b>list</b> objects capable of storing integers. 
  3160. Lines 18 and 19 use function <b>push_front</b> to insert 
  3161. integers at the beginning of <b>values</b>. Function 
  3162. <b>push_front</b> is specific to classes <b>list</b> and <b>deque</b> (not to 
  3163. <b>vector</b>). Lines 20 and 21 use function <b>push_back</b> to 
  3164. insert integers at the end of <b>values</b>. Remember that 
  3165. function <b>push_back</b> is common to all sequence 
  3166. containers.<br>
  3167. <spacer width=16 height=1>Line 25<br>
  3168. <font size=2><br></font><font size=11><pre>
  3169. values.sort();<p>
  3170. </pre></font>
  3171.  
  3172. </page>
  3173. <page pagename="20.2.2<tt> <b>list</b></tt> Sequence Container">
  3174. uses <b>list</b> member function <b>sort</b> to arrange the elements 
  3175. in the <b>list</b> in ascending order. [Note: This is different 
  3176. from the <b>sort</b> in the STL algorithms.] There is a second 
  3177. version of function <b>sort</b> that allows the programmer to 
  3178. supply a binary predicate function that takes two 
  3179. arguments (values in the list), performs a comparison 
  3180. and returns a <b>bool</b> value indicating the result. This 
  3181. function determines the order in which the elements of 
  3182. the <b>list</b> are sorted. This version could be particularly 
  3183. useful for a <b>list</b> that stores pointers rather than values. 
  3184. [Note: We demonstrate a unary predicate function in 
  3185. <a href="^Code::c:s0p14"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 20.28</a>. A unary predicate function takes a single <br>
  3186.  
  3187. </page>
  3188. <page pagename="20.2.2<tt> <b>list</b></tt> Sequence Container">
  3189. argument, performs a comparison using that argument 
  3190. and returns a <b>bool</b> value indicating the result.]<br>
  3191. <spacer width=16 height=1>Line 32<br>
  3192. <font size=2><br></font><font size=11><pre>
  3193. values.splice( values.end(), otherValues );<p>
  3194. </pre></font>
  3195. uses <b>list</b> function <b>splice</b> to remove the elements in 
  3196. <b>otherValues</b> and insert them into <b>values</b> before the 
  3197. iterator position specified as the first argument. There 
  3198. are two other versions of this function. Function <b>splice</b> 
  3199. with three arguments allows one element to be removed 
  3200. from the container specified as the second argument 
  3201. from the location specified by the iterator in the third 
  3202. argument. Function <b>splice</b> with four arguments uses the 
  3203. last two arguments to specify a range of locations that <br>
  3204.  
  3205. </page>
  3206. <page pagename="20.2.2<tt> <b>list</b></tt> Sequence Container">
  3207. should be removed from the container in the second 
  3208. argument and placed at the location specified in the first 
  3209. argument.<br>
  3210. <spacer width=16 height=1>After inserting more elements in <b>list otherValues</b> and 
  3211. sorting both <b>values</b> and <b>otherValues</b>, line 43<br>
  3212. <font size=2><br></font><font size=11><pre>
  3213. values.merge( otherValues );<p>
  3214. </pre></font>
  3215. uses <b>list</b> member function <b>merge</b> to remove all 
  3216. elements of <b>otherValues</b> and insert them in sorted 
  3217. order into <b>values</b>. Both <b>lists</b> must be sorted in the same 
  3218. order before this operation is performed. A second 
  3219. version of <b>merge</b> enables the programmer to supply a 
  3220. predicate function that takes two arguments (values in <br>
  3221.  
  3222. </page>
  3223. <page pagename="20.2.2<tt> <b>list</b></tt> Sequence Container">
  3224. the list) and returns a <b>bool</b> value. The predicate function 
  3225. specifies the sorting order used by <b>merge</b>. <br>
  3226. <spacer width=16 height=1>Line 49 uses <b>list</b> function <b>pop_front</b> to remove the first 
  3227. element in the <b>list</b>. Line 50 uses function <b>pop_back</b> 
  3228. (available for all sequence containers) to remove the 
  3229. last element in the <b>list</b>. <br>
  3230. <spacer width=16 height=1>Line 54<br>
  3231. <font size=2><br></font><font size=11><pre>
  3232. values.unique();<p>
  3233. </pre></font>
  3234. uses <b>list</b> function <b>unique</b> to remove duplicate elements 
  3235. in the <b>list</b>. The <b>list</b> should be in sorted order (so that all 
  3236. duplicates are side by side) before this operation is 
  3237. performed to guarantee that all duplicates are 
  3238. eliminated. A second version of <b>unique</b> enables the <br>
  3239.  
  3240. </page>
  3241. <page pagename="20.2.2<tt> <b>list</b></tt> Sequence Container">
  3242. programmer to supply a predicate function that takes 
  3243. two arguments (values in the list) and returns a <b>bool</b> 
  3244. value. The predicate function specifies if two elements 
  3245. are equal. <br>
  3246. <spacer width=16 height=1>Line 59<br>
  3247. <font size=2><br></font><font size=11><pre>
  3248. values.swap( otherValues );<p>
  3249. </pre></font>
  3250. uses function <b>swap</b> (available to all containers) to 
  3251. exchange the contents of <b>values</b> with the contents of 
  3252. <b>otherValues</b>.<br>
  3253. <spacer width=16 height=1>Line 65<br>
  3254. <font size=2><br></font><font size=11><pre>
  3255. values.assign( otherValues.begin(),<p>
  3256.      otherValues.end() );<p>
  3257. </pre></font>
  3258.  
  3259. </page>
  3260. <page pagename="20.2.2<tt> <b>list</b></tt> Sequence Container">
  3261. uses <b>list</b> function <b>assign</b> to replace the contents of 
  3262. <b>values</b> with the contents of <b>otherValues</b> in the range 
  3263. specified by the two iterator arguments. A second 
  3264. version of <b>assign</b> replaces the original contents with 
  3265. copies of the value specified in the second argument. 
  3266. The first argument of the function specifies the number 
  3267. of copies.<br>
  3268. <spacer width=16 height=1>Line 72<br>
  3269. <font size=2><br></font><font size=11><pre>
  3270. values.remove( 4 );<p>
  3271. </pre></font>
  3272. uses <b>list</b> function <b>remove</b> to delete all copies of the 
  3273. value <b>4</b> from the <b>list</b>.<br>
  3274.  
  3275. </page>
  3276. <page pagename="20.2.2<tt> <b>list</b></tt> Sequence Container">
  3277. <b>Select the true statement(s). </b><br>
  3278. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3279. The list sequence container provides an efficient implementation for insertion and deletion operations at any location in a container.  <br>
  3280. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3281. Header file <list> must be included to use list.  <br>
  3282. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3283. Member function unique can be used to remove duplicates from a list.  <br>
  3284. <component type=button name=b label="Check Your Answer" width=125 height=24>
  3285.  
  3286. </page>
  3287. <page pagename="20.2.3<tt> <b>deque</b></tt> Sequence Container">
  3288. <b>20.2.3<tt> <b>deque</b></tt> Sequence Container</b><br>
  3289. Class <b>deque</b> provides many of the benefits of a <b>vector</b> 
  3290. and a <b>list</b> in one container. The term <b>deque</b> 
  3291. (pronounced "deek") is short for "double-ended 
  3292. queue." Class <b>deque</b> is implemented to provide 
  3293. efficient indexed access (using subscripting) for reading 
  3294. and modifying its elements much like a <b>vector</b>. Class 
  3295. <b>deque</b> is also implemented for efficient insertion and 
  3296. deletion operations at its front and back much like a <b>list</b> 
  3297. (although a <b>list</b> is also capable of efficient insertions 
  3298. and deletions in the middle of the <b>list</b>). Class <b>deque</b> 
  3299. provides support for random-access iterators, so <b>deques</b> 
  3300. can be used with all STL algorithms. One of the most <br>
  3301.  
  3302. </page>
  3303. <page pagename="20.2.3<tt> <b>deque</b></tt> Sequence Container">
  3304. common uses of a <b>deque</b> is to maintain a first-in-first-
  3305. out queue of elements. <br>
  3306. <spacer width=16 height=1>Additional  <a href="^Perform::c:s0p18"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>storage for a <b>deque</b> can be allocated at 
  3307. either end of the <b>deque</b> in blocks of memory that are 
  3308. typically maintained as an array of <b><a href="^Perform::c:s0p17"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a></b>pointers to those 
  3309. blocks. Due to the non-contiguous memory layout of a 
  3310. <b>deque</b>, a <b>deque</b> iterator must be more intelligent than 
  3311. the pointers that are used to iterate through <b>vectors</b> or 
  3312. pointer-based arrays.<br>
  3313. <spacer width=16 height=1>Class <b>deque</b> provides the same basic operations as class 
  3314. <b>vector</b>, but adds member functions <b>push_front</b> and 
  3315. <b>pop_front</b> to allow insertion and deletion at the 
  3316. beginning of the <b>deque</b>, respectively. <br>
  3317.  
  3318. </page>
  3319. <page pagename="20.2.3<tt> <b>deque</b></tt> Sequence Container">
  3320. <a href="^Code::c:s0p4"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.18</a> demonstrates features of class <b>deque</b>. 
  3321. Remember that many of the functions presented in <a href="^Code::c:s0p1"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figs. 
  3322. 20.14</a>,  <a href="^Code::c:s0p2"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>20.15</a> and  <a href="^Code::c:s0p3"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>20.17</a> also can be used with class 
  3323. <b>deque</b>. Header file <tt><b><deque></b></tt> must be included to use 
  3324. class <b>deque</b>.<br>
  3325. <spacer width=16 height=1>Line 11<br>
  3326. <font size=2><br></font><font size=11><pre>
  3327. deque< double > values;<p>
  3328. </pre></font>
  3329. instantiates a <b>deque</b> that can store <b>double</b> values. Lines 
  3330. 14 through 16 use functions <b>push_front</b> and 
  3331. <b>push_back</b> to insert elements at the beginning and end 
  3332. of the <b>deque</b>, respectively. Remember that <b>push_back</b> 
  3333. is available for all sequence containers, but <b>push_front</b> 
  3334. is only available for class <b>list</b> and class <b>deque</b>.<br>
  3335.  
  3336. </page>
  3337. <page pagename="20.2.3<tt> <b>deque</b></tt> Sequence Container">
  3338. The <b>for</b> structure at line 20<br>
  3339. <font size=2><br></font><font size=11><pre>
  3340. for ( int i = 0; i < values.size(); i++ )<p>
  3341.    cout << values[ i ] << ' ';<p>
  3342. </pre></font>
  3343. uses the subscript operator to retrieve the value in each 
  3344. element of the <b>deque</b> for output. Note the use of 
  3345. function <b>size</b> in the condition to ensure that we do not 
  3346. attempt to access an element outside the bounds of the 
  3347. <b>deque</b>.<br>
  3348. <spacer width=16 height=1>Line 23 uses function <b>pop_front</b> to demonstrate 
  3349. removing the first element of the <b>deque</b>. Remember 
  3350. that <b>pop_front</b> is only available for class <b>list</b> and class 
  3351. <b>deque</b> (not for class <b>vector</b>).<br>
  3352. <spacer width=16 height=1>Line 27<br>
  3353.  
  3354. </page>
  3355. <page pagename="20.2.3<tt> <b>deque</b></tt> Sequence Container">
  3356. <font size=2><br></font><font size=11><pre>
  3357. values[ 1 ] = 5.4;<p>
  3358. </pre></font>
  3359. uses the subscript operator to create an <i>lvalue</i>. This 
  3360. enables values to be assigned directly to any element of 
  3361. the <b>deque</b>.<br>
  3362.  
  3363. </page>
  3364. <page pagename="20.2.3<tt> <b>deque</b></tt> Sequence Container">
  3365. <b>Select the true statement(s). </b><br>
  3366. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3367. deques can be used with all STL algorithms.  <br>
  3368. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. The header <deque> must be included. Note: Some older C++ compilers that support the STL use header files ending in .">
  3369. Header <deque.h> must be included to use deques..h <br>
  3370. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Function pop_front is only available for list and deque.">
  3371. Function pop_front is available for vector, list, and deque.  <br>
  3372. <component type=button name=b label="Check Your Answer" width=125 height=24>
  3373.  
  3374. </page>
  3375. </section>
  3376. <section type=Body name=Default title="20.3 Associative Containers">
  3377. <page>
  3378. <font size=18 bold>20.3 Associative Containers</font><hr>
  3379. The associative containers of the STL are designed to 
  3380. provide direct access to store and retrieve elements via 
  3381. <i>keys</i> (often called <i>search keys</i>). The four associative 
  3382. containers are <b>multiset</b>, <b>set</b>, <b>multimap</b> and <b>map</b>. In 
  3383. each container, the keys are maintained in sorted order. 
  3384. Iterating through an associative container traverses it in 
  3385. the sort order for that container. Classes <b>multiset</b> and 
  3386. <b>set</b> provide operations for manipulating sets of values 
  3387. where the values are the keys--i.e., there is not a 
  3388. separate value associated with each key. The main 
  3389. difference between a <b>multiset</b> and a <b>set</b> is that a <br>
  3390.  
  3391. </page>
  3392. <page>
  3393. <b>multiset</b> allows duplicate keys and a <b>set</b> does not. 
  3394. Classes <b>multimap</b> and <b>map</b> provide operations for 
  3395. manipulating values associated with a keys (these 
  3396. values are sometimes referred to as <i>mapped values</i>). 
  3397. The main difference between a <b>multimap</b> and a <b>map</b> is 
  3398. that a <b>multimap</b> allows duplicate keys with associated 
  3399. values to be stored and a <b>map</b> allows only unique keys 
  3400. with associated values. In addition to the common 
  3401. member functions of all containers presented in <a href="^Illustration::c:s0p4"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 
  3402. 20.2</a>, all associative containers also support several 
  3403. other member functions including <b>find</b>, <b>lower_bound</b>, 
  3404. <b>upper_bound</b> and <b>count</b>. Examples of each of the 
  3405. associative containers and the common associative <br>
  3406.  
  3407. </page>
  3408. <page>
  3409. container member functions are presented in the next 
  3410. several subsections. <br>
  3411.  
  3412. </page>
  3413. <page>
  3414. <b>Select the true statement(s). </b><br>
  3415. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3416. The STL associative containers are designed to provide direct access to store and retrieve element via keys.  <br>
  3417. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. multiset allows duplicate keys and set does not.">
  3418. The main difference between multiset and set is that set allows duplicate keys and multiset does not.  <br>
  3419. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3420. Class map provides operations for manipulating values associated with a key. <br>
  3421. <component type=button name=b label="Check Your Answer" width=125 height=24>
  3422.  
  3423. </page>
  3424. <page pagename="20.3.1<tt> <b>multiset</b></tt> Associative Container">
  3425. <b>20.3.1<tt> <b>multiset</b></tt> Associative Container</b><br>
  3426. The <b>multiset</b> associative container is for fast storage 
  3427. and retrieval of keys. A <b>multiset</b> allows duplicate keys. 
  3428. The ordering of the elements is determined by a 
  3429. <i>comparator function object</i>. For example, in an integer 
  3430. <b>multiset</b>, elements can be sorted in ascending order by 
  3431. ordering the keys with comparator function object <tt><b>less< 
  3432. int ></b></tt>. The data type of the keys in all associative 
  3433. containers must support comparison properly based on 
  3434. the comparator function object specified--keys sorted 
  3435. with <b>less< int ></b> must support comparison with 
  3436. <tt><b>operator<</b></tt>. If the keys used in the associative 
  3437. containers are of programmer-defined data types, those <br>
  3438.  
  3439. </page>
  3440. <page pagename="20.3.1<tt> <b>multiset</b></tt> Associative Container">
  3441. types must supply the appropriate comparison 
  3442. operators. A  <b>multiset</b> <b><a href="^Perform::c:s0p20"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a></b>supports bidirectional iterators 
  3443. (but not random-access iterators).<br>
  3444. <spacer width=16 height=1><a href="^Code::c:s0p5"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.19</a> demonstrates the <b>multiset</b> associative 
  3445. container for a <b>multiset</b> of integers sorted in ascending 
  3446. order. Header file <tt><b><set></b></tt> must be included to use class 
  3447. <b>multiset</b>. Containers <b>multiset</b> and <b>set</b> provide the same 
  3448. member functions.<br>
  3449. Lines 13 and 14<br>
  3450. <font size=2><br></font><font size=11><pre>
  3451. typedef multiset< int, less< int > > ims;<p>
  3452. ims intMultiset;  // ims for "integer multiset"<p>
  3453. </pre></font>
  3454. use a <b>typedef</b> to create a new  <a href="^Practice::c:s0p0"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>type for a <b>multiset</b> of 
  3455. integers ordered in ascending order using the function <br>
  3456.  
  3457. </page>
  3458. <page pagename="20.3.1<tt> <b>multiset</b></tt> Associative Container">
  3459. object <b>less< int ></b>. This new type is then used to 
  3460. instantiate an integer <b>multiset</b> object, <b>intMultiset</b>.<br>
  3461. <spacer width=16 height=1>The output statement at line 17<br>
  3462. <font size=2><br></font><font size=11><pre>
  3463. cout << "There are currently " <p>
  3464.       << intMultiset.count( 15 )<p>
  3465.       << " values of 15 in the multiset\n";   <p>
  3466. </pre></font>
  3467. uses function <b>count</b> (available to all associative 
  3468. containers) to count the number of occurrences of the 
  3469. value <b>15</b> currently in the <b>multiset</b>.<br>
  3470. <spacer width=16 height=1>Lines 19 and 20<br>
  3471. <font size=2><br></font><font size=11><pre>
  3472. intMultiset.insert( 15 );<p>
  3473. intMultiset.insert( 15 );<p>
  3474. </pre></font>
  3475.  
  3476. </page>
  3477. <page pagename="20.3.1<tt> <b>multiset</b></tt> Associative Container">
  3478. uses one of the three versions of function <b>insert</b> to add 
  3479. the value <b>15</b> to the <b>multiset</b> twice. A second version of 
  3480. <b>insert</b> takes an iterator and a value as arguments and 
  3481. begins the search for the insertion point from the 
  3482. iterator position specified. A third version of <b>insert</b> 
  3483. takes two iterators as arguments that specify a range of 
  3484. values to add to the <b>multiset</b> from another container.<br>
  3485. <spacer width=16 height=1>Line 27<br>
  3486. <font size=2><br></font><font size=11><pre>
  3487. result = intMultiset.find( 15 );  <p>
  3488.     // find returns iterator<p>
  3489. </pre></font>
  3490. uses function <b>find</b> (available to all associative 
  3491. containers) to locate the value <b>15</b> in the <b>multiset</b>. 
  3492. Function <b>find</b> returns an <b>iterator</b> or a <b>const_iterator</b> <br>
  3493.  
  3494. </page>
  3495. <page pagename="20.3.1<tt> <b>multiset</b></tt> Associative Container">
  3496. pointing to the earliest location at which the value is 
  3497. found. If the value is not found, <b>find</b> returns an <b>iterator</b> 
  3498. or a <b>const_iterator</b> equal to the value returned by a call 
  3499. to <b>end</b>.<br>
  3500. <spacer width=16 height=1>Line 37<br>
  3501. <font size=2><br></font><font size=11><pre>
  3502. intMultiset.insert( a, a + SIZE ); <p>
  3503.     // add array a to multiset<p>
  3504. </pre></font>
  3505. uses function <b>insert</b> to insert the elements of array <b>a</b> 
  3506. into the <b>multiset</b>. At line 39, the <b>copy</b> algorithm copies 
  3507. the elements of the <b>multiset</b> to the standard output. 
  3508. Note that the elements are displayed in ascending order.<br>
  3509. <spacer width=16 height=1>Lines 41 through 44<br>
  3510. <font size=2><br></font><font size=11><pre>
  3511. cout << "\nLower bound of 22: " <p>
  3512. </pre></font>
  3513.  
  3514. </page>
  3515. <page pagename="20.3.1<tt> <b>multiset</b></tt> Associative Container">
  3516. <font size=2><br></font><font size=11><pre>
  3517.      << *( intMultiset.lower_bound( 22 ) );<p>
  3518. cout << "\nUpper bound of 22: " <p>
  3519. </pre></font>
  3520. <font size=2><br></font><font size=11><pre>
  3521.      << *( intMultiset.upper_bound( 22 ) );<p>
  3522. </pre></font>
  3523. use functions <b>lower_bound</b> and <b>upper_bound</b> 
  3524. (available in all associative containers) to determine the 
  3525. location of the earliest occurrence of the value <b>22</b> in the 
  3526. <b>multiset</b> and the location of the element <i>after</i> the last 
  3527. occurrence of the value <b>22</b> in the <b>multiset</b>. Both 
  3528. functions return <b>iterators</b> or <b>const_iterators</b> pointing 
  3529. to the appropriate location or the iterator returned by 
  3530. <b>end</b> if the value is not in the <b>multiset</b>.<br>
  3531. <spacer width=16 height=1>Line 46<br>
  3532.  
  3533. </page>
  3534. <page pagename="20.3.1<tt> <b>multiset</b></tt> Associative Container">
  3535. <font size=2><br></font><font size=11><pre>
  3536. pair< ims::const_iterator, ims::const_iterator <p>
  3537.     > p;<p>
  3538. </pre></font>
  3539. instantiates an instance of class <b>pair</b> called <b>p</b>. Objects 
  3540. of class <b>pair</b> are used to manipulate pairs of values. In 
  3541. this example, the contents of a <b>pair</b> are two 
  3542. <b>const_iterators</b> for our integer-based <b>multiset</b>. The 
  3543. purpose of <b>p</b> is to store the return value of <b>multiset</b> 
  3544. function <b>equal_range</b> that returns a <b>pair</b> containing the 
  3545. results of both a <b>lower_bound</b> and an <b>upper_bound</b> 
  3546. operation. Type <b>pair</b> contains two <b>public</b> data members 
  3547. called <b>first</b> and <b>second</b>.<br>
  3548. <spacer width=16 height=1>Line 48<br>
  3549. <font size=2><br></font><font size=11><pre>
  3550. p = intMultiset.equal_range( 22 );<p>
  3551. </pre></font>
  3552.  
  3553. </page>
  3554. <page pagename="20.3.1<tt> <b>multiset</b></tt> Associative Container">
  3555. uses function <b>equal_range</b> to determine the 
  3556. <b>lower_bound</b> and <b>upper_bound</b> of <b>22</b> in the <b>multiset</b>. 
  3557. Lines 50 and 51 use <b>p.first</b> and <b>p.second</b>, respectively, 
  3558. to access the <b>lower_bound</b> and <b>upper_bound</b>. We 
  3559. dereferenced the iterators to output the values at the 
  3560. locations returned from <b>equal_range</b>.<br>
  3561.  
  3562. </page>
  3563. <page pagename="20.3.1<tt> <b>multiset</b></tt> Associative Container">
  3564. <b>Select the true statement(s). </b><br>
  3565. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3566. The ordering of the elements of a multiset container is determined by a comparator function object.  <br>
  3567. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3568. A multiset supports bidirectional iterators. <br>
  3569. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. A multiset does not support random-access iterators.">
  3570. A multiset supports random-access iterators.   <br>
  3571. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Header file <set> must be included.">
  3572. Header file <multiset> must be included to use multiset. <br>
  3573. <component type=button name=b label="Check Your Answer" width=125 height=24>
  3574.  
  3575. </page>
  3576. <page pagename="20.3.2<tt> <b>set</b></tt> Associative Container">
  3577. <b>20.3.2<tt> <b>set</b></tt> Associative Container</b><br>
  3578. The <b>set</b> associative container is used for fast storage and 
  3579. retrieval of unique keys. The implementation of a <b>set</b> is 
  3580. identical to a <b>multiset</b> except that a <b>set</b> must have 
  3581. unique keys. Therefore, if an attempt is made to insert a 
  3582. duplicate key into set, the duplicate is ignored; because 
  3583. this is the intended mathematical behavior of a set, we 
  3584. do not identify it as a common programming error. A 
  3585. <b>set</b> supports bidirectional iterators (but not random-
  3586. access iterators). <a href="^Code::c:s0p6"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.20</a> demonstrates <b>set</b> of 
  3587. <b>doubles</b>. Header file <tt><b><set></b></tt> must be included to use 
  3588. class <b>set</b>. <br>
  3589. <spacer width=16 height=1>Line 11<br>
  3590.  
  3591. </page>
  3592. <page pagename="20.3.2<tt> <b>set</b></tt> Associative Container">
  3593. <font size=2><br></font><font size=11><pre>
  3594. typedef set< double, less< double > > double_set;<p>
  3595. </pre></font>
  3596. uses <b>typedef</b> to create a new type for a set of <b>double</b> 
  3597. values ordered in ascending order using the function 
  3598. object <tt><b>less< double ></b></tt>. Line 14 <br>
  3599. <font size=2><br></font><font size=11><pre>
  3600. double_set doubleSet( a, a + SIZE );<p>
  3601. </pre></font>
  3602. uses the new type <b>double_set</b> to instantiate object 
  3603. <b>doubleSet</b>. The constructor call takes the elements in 
  3604. array <b>a</b> between <b>a</b> and <b>a + SIZE </b>(i.e., the entire array) 
  3605. and inserts them into the <b>set</b>. Line 18 uses algorithm 
  3606. <b>copy</b> to output the contents of the <b>set</b>. Notice that the 
  3607. value <b>2.1</b>--which appeared twice in array <b>a</b>--only 
  3608. appears once in <b>doubleSet</b>. This is because container 
  3609. <b>set</b> does not allow duplicates.<br>
  3610.  
  3611. </page>
  3612. <page pagename="20.3.2<tt> <b>set</b></tt> Associative Container">
  3613. Line 20<br>
  3614. <font size=2><br></font><font size=11><pre>
  3615. pair< double_set::const_iterator, bool > p;<p>
  3616. </pre></font>
  3617. declares a <b>pair</b> consisting of a <b>const_iterator</b> for a 
  3618. <b>double_set</b> and a <b>bool</b> value. This object stores the 
  3619. result of a call to <b>set</b> function <b>insert</b>.<br>
  3620. <spacer width=16 height=1>Line 22<br>
  3621. <font size=2><br></font><font size=11><pre>
  3622. p = doubleSet.insert( 13.8 ); // value not in set<p>
  3623. </pre></font>
  3624. uses function <b>insert</b> to place the value <b>13.8</b> in the <b>set</b>. 
  3625. The returned <b>pair</b>, <b>p</b>, contains an iterator <b>p.first</b> 
  3626. pointing to the value <b>13.8</b> in the <b>set</b> and a <b>bool</b> value 
  3627. that is <b>true</b> if the value was inserted and <b>false</b> if the <br>
  3628.  
  3629. </page>
  3630. <page pagename="20.3.2<tt> <b>set</b></tt> Associative Container">
  3631. value was not inserted (because it was already in the 
  3632. <b>set</b>).<br>
  3633.  
  3634. </page>
  3635. <page pagename="20.3.2<tt> <b>set</b></tt> Associative Container">
  3636. <b>Select the true statement(s). </b><br>
  3637. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3638. A set supports bidirectional iterators. <br>
  3639. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3640. The set associative container is used for fast storage and retrieval of unique keys.  <br>
  3641. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. A set does not support random-access iterators.">
  3642. A set support random-access iterators.   <br>
  3643. <component type=button name=b label="Check Your Answer" width=125 height=24>
  3644.  
  3645. </page>
  3646. <page pagename="20.3.3<tt> <b>multimap</b></tt> Associative Container">
  3647. <b>20.3.3<tt> <b>multimap</b></tt> Associative Container</b><br>
  3648. The <b>multimap</b> associative container is used for fast 
  3649. storage and retrieval of keys and associated values 
  3650. (often called <i>key/value pairs</i>). Many of the methods 
  3651. used with <b>multisets</b> and <b>sets</b> are also used with 
  3652. <b>multimaps</b> and <b>maps</b>. The elements of <b>multimaps</b> and 
  3653. <b>maps</b> are <b>pairs</b> of keys and values instead of individual 
  3654. values. When inserting into a <b>multimap</b> or <b>map</b>, a <b>pair</b> 
  3655. object that contains the key and the value is used. The 
  3656. ordering of the keys is determined by a comparator 
  3657. function object. For example, in a <b>multimap</b> that uses 
  3658. integers as the key type, keys can be sorted in ascending 
  3659. order by ordering the keys with comparator function <br>
  3660.  
  3661. </page>
  3662. <page pagename="20.3.3<tt> <b>multimap</b></tt> Associative Container">
  3663. object <tt><b>less< int ></b></tt>. Duplicate keys are allowed in a 
  3664. <b>multimap</b>, so multiple values can be associated with a 
  3665. single key. This is often called a one-to-many 
  3666. relationship. For example, in a credit-card transaction-
  3667. processing system, one credit card account can have 
  3668. many associated transactions; in a university, one 
  3669. student can take many courses and one professor can 
  3670. teach many students; in the military, one rank (like 
  3671. "private") has many people. A <b>multimap</b> supports 
  3672. bidirectional iterators (but not random-access iterators). 
  3673. As with <b>multisets</b> and <b>sets</b>,  <b>multimaps</b> are <b><a href="^Perform::c:s0p22"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a></b>typically 
  3674. implemented as a red-black binary search tree in which 
  3675. the nodes of the tree are key/value <b>pairs</b>. <a href="^Code::c:s0p7"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.21</a> <br>
  3676.  
  3677. </page>
  3678. <page pagename="20.3.3<tt> <b>multimap</b></tt> Associative Container">
  3679. demonstrates the <b>multimap</b> associative container. 
  3680. Header file <b><map></b> must be included to use class 
  3681. <b>multimap</b>. <br>
  3682. <spacer width=16 height=1>Line 10<br>
  3683. <font size=2><br></font><font size=11><pre>
  3684. typedef multimap< int, double, less< int > > mmid;<p>
  3685. </pre></font>
  3686. uses <b>typedef</b> to define a <b>multimap</b> type where the key 
  3687. type is <b>int</b>, the type of an associated value is <b>double</b> and 
  3688. the elements are ordered in ascending order. Line 11 
  3689. uses the new type to instantiate a <b>multimap</b> called 
  3690. <b>pairs</b>.<br>
  3691. <spacer width=16 height=1>The statement at line 13<br>
  3692. <font size=2><br></font><font size=11><pre>
  3693. cout << "There are currently " <p>
  3694.      << pairs.count( 15 )<p>
  3695. </pre></font>
  3696.  
  3697. </page>
  3698. <page pagename="20.3.3<tt> <b>multimap</b></tt> Associative Container">
  3699. <font size=2><br></font><font size=11><pre>
  3700.      << " pairs with key 15\n";<p>
  3701. </pre></font>
  3702. uses function <b>count</b> to determine the number of key/
  3703. value pairs with a key of <b>15</b>. <br>
  3704. <spacer width=16 height=1>Line 15<br>
  3705. <font size=2><br></font><font size=11><pre>
  3706. pairs.insert( mmid::value_type( 15, 2.7 ) );<p>
  3707. </pre></font>
  3708. uses function <b>insert</b> to add a new key/value pair to the 
  3709. <b>multimap</b>. The expression <b>mmid::value_type( 15, 2.7 
  3710. )</b> creates a <b>pair</b> object in which <b>first</b> is the key (<b>15</b>) of 
  3711. type <b>int</b> and <b>second</b> is the value (<b>2.7</b>) of type <b>double</b>. 
  3712. The type <b>mmid::value_type</b> is defined in line 10 as 
  3713. part of the <b>typedef</b> for the <b>multimap</b>.<br>
  3714.  
  3715. </page>
  3716. <page pagename="20.3.3<tt> <b>multimap</b></tt> Associative Container">
  3717. The <b>for</b> structure at line 27 outputs the contents of the 
  3718. <b>multimap</b> including both keys and values. Lines 29 and 
  3719. 30<br>
  3720. <font size=2><br></font><font size=11><pre>
  3721. cout << iter->first << '\ ' <p>
  3722.      << iter->second << '\n';<p>
  3723. </pre></font>
  3724. use the <b>const_iterator</b> called <b>iter</b> to access the 
  3725. members of the <b>pair</b> in each element of the <b>multimap</b>. 
  3726. Notice in the output that the keys are in ascending 
  3727. order.<br>
  3728.  
  3729. </page>
  3730. <page pagename="20.3.3<tt> <b>multimap</b></tt> Associative Container">
  3731. <b>Select the true statement(s). </b><br>
  3732. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Duplicate keys are allowed in multimaps.">
  3733. Duplicate keys are not allowed in multimaps.   <br>
  3734. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3735. The elements of multimaps and maps are pairs of keys and values instead of individual values.   <br>
  3736. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3737. multimaps are typically implemented as binary search trees.   <br>
  3738. <component type=button name=b label="Check Your Answer" width=125 height=24>
  3739.  
  3740. </page>
  3741. <page pagename="20.3.4<tt> <b>map</b></tt> Associative Container">
  3742. <b>20.3.4<tt> <b>map</b></tt> Associative Container</b><br>
  3743. The <b>map</b> associative container is used for fast storage 
  3744. and retrieval of unique keys and associated values. 
  3745. Duplicate keys are not allowed in a <b>map</b>, so only a 
  3746. single value can be associated with each key. This is 
  3747. called a <i>one-to-one mapping</i>. For example, a company 
  3748. that uses unique employee numbers such as a 100, 200 
  3749. and 300 might have a <b>map</b> that associates employee 
  3750. numbers with their telephone extensions 4321, 4115, 
  3751. and 5217, respectively. With a <b>map</b> you specify the key 
  3752. and get back the associated data quickly. A <b>map</b> is 
  3753. commonly called an <i>associative array</i>. Providing the 
  3754. key in a <b>map's</b> subscript operator <b>[]</b>, locates the value <br>
  3755.  
  3756. </page>
  3757. <page pagename="20.3.4<tt> <b>map</b></tt> Associative Container">
  3758. associated with that key in the <b>map</b>. Insertions and 
  3759. deletions may be made anywhere in a <b>map</b>. <br>
  3760. <spacer width=16 height=1><a href="^Code::c:s0p8"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.22</a> demonstrates the <b>map</b> associative 
  3761. container. <a href="^Code::c:s0p8"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.22</a> uses the same features as <a href="^Code::c:s0p7"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 
  3762. 20.21</a> except for the subscript operator. Header file 
  3763. <tt><b><map></b></tt> must be included to use class <b>map</b>. Lines 29 
  3764. and 30<br>
  3765. <font size=2><br></font><font size=11><pre>
  3766. pairs[ 25 ] = 9999.99;  <p>
  3767.     // change existing value for 25<p>
  3768. pairs[ 40 ] = 8765.43;  <p>
  3769.     // insert new value for 40<p>
  3770. </pre></font>
  3771. use the subscript operator of class <b>map</b>. When the 
  3772. subscript is a key that is already in the <b>map</b>, the <br>
  3773.  
  3774. </page>
  3775. <page pagename="20.3.4<tt> <b>map</b></tt> Associative Container">
  3776. operator returns a reference to the associated value. 
  3777. When the subscript is a key that is not in the <b>map</b>, the 
  3778. operator inserts the key in the <b>map</b> and returns a 
  3779. reference that can be used to associate a value with that 
  3780. key. Line 29 replaces the value for the key <b>25</b> 
  3781. (previously <b>33.333</b> as specified in line 17) with a new 
  3782. value of <b>9999.99</b>. Line 30 inserts a new key/value <b>pair</b> 
  3783. (called <i>creating an association</i>) in the <b>map</b>. <br>
  3784.  
  3785. </page>
  3786. <page pagename="20.3.4<tt> <b>map</b></tt> Associative Container">
  3787. <b>Select the true statement(s). </b><br>
  3788. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3789. A map is commonly called an associative array.   <br>
  3790. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Insertions can be made anywhere in the map.">
  3791. Insertions can only be made at the front of a map. <br>
  3792. <component type=button name=b label="Check Your Answer" width=125 height=24>
  3793.  
  3794. </page>
  3795. </section>
  3796. <section type=Body name=Default title="20.4 Container Adapters">
  3797. <page>
  3798. <font size=18 bold>20.4 Container Adapters</font><hr>
  3799. The STL provides three so-called <i>container adapters</i>--
  3800. <tt><b>stack</b></tt>, <b>queue</b> and <b>priority_queue</b>. Adapters are not 
  3801. first-class containers because they do not provide the 
  3802. actual data structure implementation in which elements 
  3803. can be stored and because adapters do not support 
  3804. iterators. The benefit of an adapter class is that the 
  3805. programmer can choose an appropriate underlying data 
  3806. structure. All three adapter classes provide member 
  3807. functions <b>push</b> and <b>pop</b> that implement the proper 
  3808. method of inserting an element into each adapter data 
  3809. structure and the proper method of removing an <br>
  3810.  
  3811. </page>
  3812. <page>
  3813. element from each adapter data structure. The next 
  3814. several subsections provide examples of the adapter 
  3815. classes. <br>
  3816.  
  3817. </page>
  3818. <page>
  3819. <b>Select the true statement(s). </b><br>
  3820. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3821. Adapters are not first-class containers.   <br>
  3822. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. The programmer can choose the underlying data structure of an adapter, but normally the default underlying container specified by the adapter is used.">
  3823. The programmer cannot choose the underlying data structure of an adapter.   <br>
  3824. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3825. Adapter classes stack, queue, and priority_queue provide member functions push and pop.   <br>
  3826. <component type=button name=b label="Check Your Answer" width=125 height=24>
  3827.  
  3828. </page>
  3829. <page pagename="20.4.1<tt> <b>stack</b></tt> Adapter">
  3830. <b>20.4.1<tt> <b>stack</b></tt> Adapter</b><br>
  3831. Class <b>stack</b> provides functionality that enables 
  3832. insertions into and deletions from the underlying data 
  3833. structure at one end (commonly referred to as a <i>last-in-
  3834. first-out</i> data structure). A <b>stack</b> can be implemented 
  3835. with any of the sequence containers: <b>vector</b>, <b>list</b> and 
  3836. <b>deque</b>. This example creates three integer stacks using 
  3837. each of the sequence containers of the Standard Library 
  3838. as the underlying data structure to represent the <b>stack</b>. 
  3839. By default, a <b>stack</b> is implemented with a <b>deque</b>. The 
  3840. <b>stack</b> operations are: <b>push</b> to insert an element at the 
  3841. top of the <b>stack</b> (implemented by calling function 
  3842. <b>push_back</b> of the underlying container), <b>pop</b> to remove <br>
  3843.  
  3844. </page>
  3845. <page pagename="20.4.1<tt> <b>stack</b></tt> Adapter">
  3846. the top element of the <b>stack</b> (implemented by calling 
  3847. function <b>pop_back</b> of the underlying container), <b>top</b> to 
  3848. get a reference to the top <b><a href="^Perform::c:s0p23"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a></b>element of the  <b>stack</b> 
  3849. (implemented by calling function <b>back</b> of the 
  3850. underlying container), <b>empty</b> to determine if the <b>stack</b> 
  3851. is empty (implemented by calling function <b>empty</b> of the 
  3852. underlying container) and <b>size</b> to get the number of 
  3853. elements in the <b>stack</b> (implemented by calling function 
  3854. <b>size</b> of the  <a href="^Perform::c:s0p24"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>underlying container).<br>
  3855. <spacer width=16 height=1><a href="^Code::c:s0p9"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.23</a> demonstrates the <b>stack</b> adapter class. 
  3856. Header file <tt><b><stack></b></tt> must be included to use class 
  3857. <b>stack</b>.<br>
  3858. <spacer width=16 height=1>Lines 15 through 17<br>
  3859.  
  3860. </page>
  3861. <page pagename="20.4.1<tt> <b>stack</b></tt> Adapter">
  3862. <font size=2><br></font><font size=11><pre>
  3863. stack< int > intDequeStack; <p>
  3864.     // default is deque-based stack<p>
  3865. </pre></font>
  3866. <font size=2><br></font><font size=11><pre>
  3867. stack< int, vector< int > > intVectorStack;<p>
  3868. stack< int, list< int > > intListStack;<p>
  3869. </pre></font>
  3870. instantiate three integer stacks. Line 15 specifies a 
  3871. <b>stack</b> of integers that uses the default <b>deque</b> container 
  3872. as its underlying data structure. Line 16 specifies a 
  3873. <b>stack</b> of integers that uses a <b>vector</b> of integers as its 
  3874. underlying data structure. Line 17 specifies a <b>stack</b> of 
  3875. integers that uses a <b>list</b> of integers as its underlying data 
  3876. structure.<br>
  3877.  
  3878. </page>
  3879. <page pagename="20.4.1<tt> <b>stack</b></tt> Adapter">
  3880. Lines 20 through 22 each use function <b>push</b> (available 
  3881. in each adapter class) to place an integer on top of each 
  3882. <b>stack</b>.<br>
  3883. <spacer width=16 height=1>Function <b>popElements</b> at line 36, pops the elements off 
  3884. each <b>stack</b>. Line 40 uses <b>stack</b> function <b>top</b> to retrieve 
  3885. the top element of the <b>stack</b> for output. Function <b>top</b> 
  3886. does not remove the top element. Line 41 uses function 
  3887. <tt><b>pop</b></tt> (available in each adapter class) to remove the top 
  3888. element of the <b>stack</b>. Function <b>pop</b> does not return a 
  3889. value.<br>
  3890.  
  3891. </page>
  3892. <page pagename="20.4.1<tt> <b>stack</b></tt> Adapter">
  3893. <b>Select the true statement(s). </b><br>
  3894. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3895. A stack can be implemented with any sequence container.   <br>
  3896. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. A stack is implemented with a deque by default.">
  3897. By default a stack is implemented with vector.   <br>
  3898. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3899. Header <stack> must be included to use stack.   <br>
  3900. <component type=button name=b label="Check Your Answer" width=125 height=24>
  3901.  
  3902. </page>
  3903. <page pagename="20.4.2<tt> <b>queue</b></tt> Adapter">
  3904. <b>20.4.2<tt> <b>queue</b></tt> Adapter</b><br>
  3905. Class <b>queue</b> provides functionality that enables 
  3906. insertions at the back of the underlying data structure 
  3907. and deletions from the front of the underlying data 
  3908. structure (commonly referred to as a <i>first-in-first-out</i> 
  3909. data structure). A <b>queue</b> can be implemented with STL 
  3910. data structures <b>list</b> and <b>deque</b>. By default, a <b>queue</b> is 
  3911. implemented with a <b>deque</b>. The common <b>queue</b> 
  3912. operations are: <b>push</b> to insert an element at the back of 
  3913. the <b>queue</b> (implemented by calling function 
  3914. <b>push_back</b> of the underlying container), <b>pop</b> to remove 
  3915. the element at the front of the <b>queue</b> (implemented by 
  3916. calling function <b>pop_front</b> of the underlying <br>
  3917.  
  3918. </page>
  3919. <page pagename="20.4.2<tt> <b>queue</b></tt> Adapter">
  3920. container), <b>front</b> to get a reference to the first element 
  3921. in the  <b>queue</b> (implemented by <b><a href="^Perform::c:s0p26"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a></b>calling function <b>front</b> of 
  3922. the underlying container), <b>back</b> to get a reference to the 
  3923. last element in the <b>queue</b> (implemented by calling 
  3924. function <b>back</b> of the underlying container), <b>empty</b> to 
  3925. determine if the <b>queue</b> is empty (implemented by 
  3926. calling function <b>empty</b> of the  <a href="^Perform::c:s0p25"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>underlying container) 
  3927. and <b>size</b> to get the number of elements in the <b>queue</b> 
  3928. (implemented by calling function <b>size</b> of the underlying 
  3929. container).<br>
  3930. <spacer width=16 height=1><a href="^Code::c:s0p10"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.24</a> demonstrates the <b>queue</b> adapter class. 
  3931. Header file <tt><b><queue></b></tt> must be included to use a <b>queue</b>.<br>
  3932. <spacer width=16 height=1>Line 10<br>
  3933.  
  3934. </page>
  3935. <page pagename="20.4.2<tt> <b>queue</b></tt> Adapter">
  3936. <font size=2><br></font><font size=11><pre>
  3937. queue< double > values;<p>
  3938. </pre></font>
  3939. instantiates a <b>queue</b> that stores <b>double</b> values. Lines 12 
  3940. through 14 use function <b>push</b> to add elements to the 
  3941. <b>queue</b>. The <b>while</b> structure at line 18 uses function 
  3942. <b>empty</b> (available in all containers) to determine if the 
  3943. <b>queue</b> is empty. <br>
  3944. <spacer width=16 height=1>While there are more elements in the <b>queue</b>, line 19 
  3945. uses <b>queue</b> function <b>front</b> to read (but not remove) the 
  3946. first element in the <b>queue</b> for output. Line 20 removes 
  3947. the first element in the <b>queue</b> with function <b>pop</b> 
  3948. (available in all adapter classes).<br>
  3949.  
  3950. </page>
  3951. <page pagename="20.4.2<tt> <b>queue</b></tt> Adapter">
  3952. <b>Select the true statement(s). </b><br>
  3953. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3954. A queue can be implemented with either list or deque.   <br>
  3955. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  3956. A queue allows deletions from the front.   <br>
  3957. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. A queue is implemented with deque by default.">
  3958. By default a queue is implemented with list.   <br>
  3959. <component type=button name=b label="Check Your Answer" width=125 height=24>
  3960.  
  3961. </page>
  3962. <page pagename="20.4.3<tt> <b>priority_queue</b></tt> Adapter">
  3963. <b>20.4.3<tt> <b>priority_queue</b></tt> Adapter</b><br>
  3964. Class <b>priority_queue</b> provides functionality that 
  3965. enables insertions in sorted order into the underlying 
  3966. data structure and deletions from the front of the 
  3967. underlying data structure. A <b>priority_queue</b> can be 
  3968. implemented with STL data structures <b>vector</b> and 
  3969. <b>deque</b>. By default, a <b>priority_queue</b> is implemented 
  3970. with a <b>vector</b> as the underlying data structure. When 
  3971. adding elements to a <b>priority_queue</b>, the elements are 
  3972. automatically inserted in priority order such that the 
  3973. highest priority element (i.e., the largest value) will be 
  3974. the first element removed from the <b>priority_queue</b>. 
  3975. This is usually accomplished by using a sorting <br>
  3976.  
  3977. </page>
  3978. <page pagename="20.4.3<tt> <b>priority_queue</b></tt> Adapter">
  3979. technique called <i>heapsort</i> that always maintains the 
  3980. largest value (i.e., highest priority) at the front of the 
  3981. data structure--such a data structure is called a <i>heap</i>. 
  3982. The comparison of elements is performed with 
  3983. comparator function object <tt><b>less< T ></b></tt> by default, but the 
  3984. programmer can supply a different comparator.<br>
  3985. <spacer width=16 height=1>The common <b>priority_queue</b> operations are: <tt><b>push</b></tt> to 
  3986. insert an element at the appropriate location based on 
  3987. priority order of the <b>priority_queue</b> (implemented by 
  3988. calling function <tt><b>push_back</b></tt> of the underlying container 
  3989. then reordering the elements using heapsort), <tt><b>pop</b></tt> to 
  3990. remove the highest priority element of the  
  3991. <b>priority_queue</b> (implemented by calling<a href="^Perform::c:s0p28"> <b><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></b></a>function <b>
  3992. </b><br>
  3993.  
  3994. </page>
  3995. <page pagename="20.4.3<tt> <b>priority_queue</b></tt> Adapter">
  3996. <b>pop_back</b> of the underlying container after removing 
  3997. the top element of the heap), <b>top</b> to get a reference to 
  3998. the top element of the <b>priority_queue</b> (implemented by 
  3999. calling function <b>front</b> of the underlying container), 
  4000. <b>empty</b> to determine if the <b>priority_queue</b> is empty 
  4001. (implemented by calling function <b>empty</b> of the 
  4002. underlying  <a href="^Perform::c:s0p27"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>container) and <b>size</b> to get the number of 
  4003. elements in the <b>priority_queue</b> (implemented by 
  4004. calling function <b>size</b> of the underlying container).<br>
  4005. <spacer width=16 height=1><a href="^Code::c:s0p11"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.25</a> demonstrates the <b>priority_queue</b> adapter 
  4006. class. Header file <tt><b><queue></b></tt> must be included to use 
  4007. class <b>priority_queue</b>.<br>
  4008. <spacer width=16 height=1>Line 11<br>
  4009.  
  4010. </page>
  4011. <page pagename="20.4.3<tt> <b>priority_queue</b></tt> Adapter">
  4012. <font size=2><br></font><font size=11><pre>
  4013. priority_queue< double > priorities;<p>
  4014. </pre></font>
  4015. instantiates a <b>priority_queue</b> that stores <b>double</b> values 
  4016. and uses a <b>deque</b> as the underlying data structure. Lines 
  4017. 13 through 15 use function <b>push</b> to add elements to the 
  4018. <b>priority_queue</b>. The <b>while</b> structure at line 19 uses 
  4019. function <b>empty</b> (available in all containers) to 
  4020. determine if the <b>priority_queue</b> is empty. While there 
  4021. are more elements in the <b>priority_queue</b>, line 20 uses 
  4022. <b>priority_queue</b> function <b>top</b> to retrieve the highest 
  4023. priority element in the <b>priority_queue</b> for output. Line 
  4024. 21 physically removes the highest priority element in 
  4025. the <b>priority_queue</b> with function <b>pop</b> (available in all 
  4026. adapter classes).<br>
  4027.  
  4028. </page>
  4029. <page pagename="20.4.3<tt> <b>priority_queue</b></tt> Adapter">
  4030. <b>Select the true statement(s). </b><br>
  4031. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4032. A priority_queue allows deletions from the front.   <br>
  4033. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. A priority_queue is implemented with vector by default.">
  4034. By default a priority_queue is implemented with deque.   <br>
  4035. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4036. A priority_queue can be implemented with either vector or deque.   <br>
  4037. <component type=button name=b label="Check Your Answer" width=125 height=24>
  4038.  
  4039. </page>
  4040. </section>
  4041. <section type=Body name=Default title="20.5 Algorithms">
  4042. <page>
  4043. <font size=18 bold>20.5 Algorithms</font><hr>
  4044. Until STL, class libraries of containers and algorithms 
  4045. were essentially incompatible among vendors. Early 
  4046. container libraries generally used inheritance and 
  4047. polymorphism, with the associated overhead of <b>virtual</b> 
  4048. function calls. Early libraries had the algorithms built in 
  4049. to the container classes as class behaviors.  <a href="^Engineer::c:s0p12"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>STL 
  4050. separates the algorithms from the containers. This 
  4051. makes it much easier to add new  <a href="^Engineer::c:s0p11"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>algorithms. STL is 
  4052. implemented for efficiency. It avoids the overhead of 
  4053. <b>virtual</b> function calls. With STL, the elements of 
  4054. containers are accessed through iterators.<br>
  4055.  
  4056. </page>
  4057. <page pagename="20.5.1 <b>fill</b>, <b>fill_n</b>, <b>generate</b> and <b>generate_n</b>  ">
  4058. <b>20.5.1 <b>fill</b>, <b>fill_n</b>, <b>generate</b> and <b>generate_n</b>  </b><br>
  4059. <b><a href="^Code::c:s0p12"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.26</a></b> demonstrates the <b>fill</b>, <b>fill_n</b>, <b>generate</b> and 
  4060. <b>generate_n</b> Standard Library functions. Functions <b>fill</b> 
  4061. and <b>fill_n</b> set every element in a range of container 
  4062. elements to a specific value. Functions <b>generate</b> and 
  4063. <b>generate_n</b> use a <i>generator function</i> to create values 
  4064. for every element in a range of container elements. The 
  4065. generator function takes no arguments and returns a 
  4066. value that can be placed in an element of the container.<br>
  4067. Line 17<br>
  4068. <font size=2><br></font><font size=11><pre>
  4069. fill( chars.begin(), chars.end(), '5' );<p>
  4070. </pre></font>
  4071. uses function <b>fill</b> to place the character <b>'5'</b> in every 
  4072. element of <tt><b>vector chars</b></tt> from <b>chars.begin()</b> up to, but <br>
  4073.  
  4074. </page>
  4075. <page pagename="20.5.1 <b>fill</b>, <b>fill_n</b>, <b>generate</b> and <b>generate_n</b>  ">
  4076. not including, <b>chars.end()</b>. Note that the iterators 
  4077. supplied as the first and second argument must be at 
  4078. least forward iterators (i.e., they can be used for both 
  4079. input from a container and output to a container in the 
  4080. forward direction).<br>
  4081. <spacer width=16 height=1>Line 21<br>
  4082. <font size=2><br></font><font size=11><pre>
  4083. fill_n( chars.begin(), 5, 'A' );<p>
  4084. </pre></font>
  4085. uses function <b>fill_n</b> to place the character <b>'A'</b> in the first 
  4086. five elements of <b>vector chars</b>. The iterator supplied as 
  4087. the first argument must be at least an output iterator 
  4088. (i.e., it can be used for output to a container in the 
  4089. forward direction). The second argument specifies the <br>
  4090.  
  4091. </page>
  4092. <page pagename="20.5.1 <b>fill</b>, <b>fill_n</b>, <b>generate</b> and <b>generate_n</b>  ">
  4093. number of elements to fill. The third argument specifies 
  4094. the value to place in each element.<br>
  4095. <spacer width=16 height=1>Line 26<br>
  4096. <font size=2><br></font><font size=11><pre>
  4097. generate( chars.begin(), chars.end(), <p>
  4098.     nextLetter );<p>
  4099. </pre></font>
  4100. uses function <b>generate</b> to place the result of a call to 
  4101. generator function <b>nextLetter</b> in every element of 
  4102. <b>vector chars</b> from <b>chars.begin()</b> up to, but not 
  4103. including, <b>chars.end()</b>. The iterators supplied as the 
  4104. first and second arguments must be at least forward 
  4105. iterators. Function <b>nextLetter</b> (defined at line 39) 
  4106. begins with the character <b>'A'</b> maintained in a <b>static</b> 
  4107. local variable. The statement at line 42<br>
  4108.  
  4109. </page>
  4110. <page pagename="20.5.1 <b>fill</b>, <b>fill_n</b>, <b>generate</b> and <b>generate_n</b>  ">
  4111. <font size=2><br></font><font size=11><pre>
  4112. return letter++;<p>
  4113. </pre></font>
  4114. returns the current value of <b>letter</b> each time <b>nextLetter</b> 
  4115. is called, then increments the value of <b>letter</b>.<br>
  4116. <spacer width=16 height=1>Line 30<br>
  4117. <font size=2><br></font><font size=11><pre>
  4118. generate_n( chars.begin(), 5, nextLetter );<p>
  4119. </pre></font>
  4120. uses function <b>generate_n</b> to place the result of a call to 
  4121. generator function <b>nextLetter</b> in five elements of 
  4122. <b>vector</b> <b>chars</b> starting from <b>chars.begin()</b>. The iterator 
  4123. supplied as the first argument must be at least an output 
  4124. iterator.<br>
  4125.  
  4126. </page>
  4127. <page pagename="20.5.1 <b>fill</b>, <b>fill_n</b>, <b>generate</b> and <b>generate_n</b>  ">
  4128. <b>Select the true statement(s). </b><br>
  4129. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. The generator function passed to generate_n does not take any arguments and returns a value that can be placed in the container.">
  4130. The generator function passed to generate_n takes one argument and does not return a value.   <br>
  4131. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4132. Functions fill and fill_n set every element in a range of container elements to a specific value.   <br>
  4133. <component type=button name=b label="Check Your Answer" width=125 height=24>
  4134.  
  4135. </page>
  4136. <page pagename="20.5.2<tt> <b>equal</b></tt>, <b>mismatch</b> and ">
  4137. <b>lexicographical_compare 
  4138. </b>
  4139. <b>20.5.2<tt> <b>equal</b></tt>, <b>mismatch</b> and 
  4140. <b>lexicographical_compare 
  4141. </b></b><br>
  4142. <a href="^Code::c:s0p13"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.27</a> demonstrates comparing sequences of 
  4143. values for equality with Standard Library functions 
  4144. <b>equal</b>, <b>mismatch</b> and <b>lexicographical_compare</b>.<br>
  4145. <spacer width=16 height=1>Line 27<br>
  4146. <font size=2><br></font><font size=11><pre>
  4147. bool result = equal( v1.begin(), v1.end(),<p>
  4148.     v2.begin() );<p>
  4149. </pre></font>
  4150. uses function <tt><b>equal</b></tt> to compare two sequences of 
  4151. values for equality. Each sequence need not necessarily 
  4152. contain the same number of elements--<b>equal</b> returns 
  4153. <b>false</b> if the sequences are not the same length. Function 
  4154. <tt><b>operator==</b></tt> performs the comparison of the elements. <br>
  4155.  
  4156. </page>
  4157. <page pagename="20.5.2<tt> <b>equal</b></tt>, <b>mismatch</b> and ">
  4158. In this example, the elements in <b>vector v1</b> from 
  4159. <b>v1.begin()</b> up to, but not including, <b>v1.end()</b> are 
  4160. compared to the elements in <b>vector v2</b> starting from 
  4161. <b>v2.begin()</b> (in this example, <b>v1</b> and <b>v2</b> are equal). The 
  4162. three iterator arguments must be at least input iterators 
  4163. (i.e., they can be used for input from a sequence in the 
  4164. forward direction). Line 31 uses function <b>equal</b> to 
  4165. compare <b>vectors v1</b> and <b>v3</b> which are not equal.<br>
  4166. <spacer width=16 height=1>There is another version of function <b>equal</b> that takes a 
  4167. binary predicate function as a fourth parameter. The 
  4168. binary predicate function receives the two elements 
  4169. being compared and returns a <b>bool</b> value indicating 
  4170. whether or not the elements are equal. This would be <br>
  4171.  
  4172. </page>
  4173. <page pagename="20.5.2<tt> <b>equal</b></tt>, <b>mismatch</b> and ">
  4174. useful in sequences that store pointers to values rather 
  4175. than actual values because you can define a comparison 
  4176. of what the pointers refer to rather than comparing the 
  4177. pointer contents (i.e., the addresses stored in the 
  4178. pointers).<br>
  4179. <spacer width=16 height=1>Lines 35 through 37<br>
  4180. <font size=2><br></font><font size=11><pre>
  4181. pair< vector< int >::iterator,<p>
  4182.       vector< int >::iterator > location;<p>
  4183. location = mismatch( v1.begin(), v1.end(),<p>
  4184.       v3.begin() );<p>
  4185. </pre></font>
  4186. begin by instantiating a <b>pair</b> of iterators called <b>location</b> 
  4187. for a <b>vector</b> of integers. This object stores the result of 
  4188. the call to <b>mismatch</b> on line 37. Function <b>mismatch</b> <br>
  4189.  
  4190. </page>
  4191. <page pagename="20.5.2<tt> <b>equal</b></tt>, <b>mismatch</b> and ">
  4192. compares two sequences of values and returns a <b>pair</b> of 
  4193. iterators indicating the location in each sequence of the 
  4194. mismatched elements. If all the elements match, the two 
  4195. iterators in the <b>pair</b> are equal to the last iterator for each 
  4196. sequence. The three iterator arguments must be at least 
  4197. input iterators. To determine the actual location of the 
  4198. mismatch in the <b>vectors</b> in this example, the expression 
  4199. at line 39 <tt><b>location.first - v1.begin()</b></tt> is used. The result 
  4200. of this calculation is the number of elements between 
  4201. the iterators (this is analogous to pointer arithmetic that 
  4202. we studied in Chapter 5). This corresponds to the 
  4203. element number in this example, because the <br>
  4204.  
  4205. </page>
  4206. <page pagename="20.5.2<tt> <b>equal</b></tt>, <b>mismatch</b> and ">
  4207. comparison is performed from the beginning of each 
  4208. <b>vector</b>.<br>
  4209. <spacer width=16 height=1>As with function <b>equal</b>, there is another version of 
  4210. function <b>mismatch</b> that takes a binary predicate 
  4211. function as a fourth parameter. <br>
  4212. <spacer width=16 height=1>Lines 46 and 47<br>
  4213. <font size=2><br></font><font size=11><pre>
  4214. result = <p>
  4215.    lexicographical_compare( c1, c1 + SIZE, c2, <p>
  4216.       c2 + SIZE );<p>
  4217. </pre></font>
  4218. use function <b>lexicographical_compare</b> to compare the 
  4219. contents of two character arrays. This function's four 
  4220. iterator arguments must be at least input iterators. As 
  4221. you know, pointers into arrays are random-access <br>
  4222.  
  4223. </page>
  4224. <page pagename="20.5.2<tt> <b>equal</b></tt>, <b>mismatch</b> and ">
  4225. iterators. The first two iterator arguments specify the 
  4226. range of locations in the first sequence. The last two 
  4227. iterator arguments specify the range of locations in the 
  4228. second sequence. While iterating through the 
  4229. sequences, if the element in the first sequence is less 
  4230. than the corresponding element in the second sequence, 
  4231. the function returns <b>true</b>. If the element in the first 
  4232. sequence is greater than or equal to the element in the 
  4233. second sequence, the function returns <b>false</b>. This 
  4234. function can be used to arrange sequences 
  4235. lexicographically. Typically such sequences contain 
  4236. strings.<br>
  4237.  
  4238. </page>
  4239. <page pagename="20.5.2<tt> <b>equal</b></tt>, <b>mismatch</b> and ">
  4240. <b>Select the true statement(s). </b><br>
  4241. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4242. Function equal compares two sequences for equality.   <br>
  4243. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4244. Function lexicographical_compare compares two sequences for sorting purposes.   <br>
  4245. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4246. Function mismatch compares two sequences and returns a pair of iterators indicating where the mismatched elements are in the sequences.   <br>
  4247. <component type=button name=b label="Check Your Answer" width=125 height=24>
  4248.  
  4249. </page>
  4250. <page pagename="20.5.3<tt> <b>remove</b></tt>, <b>remove_if</b>, <b>remove_copy</b> and ">
  4251. <b>remove_copy_if 
  4252. </b>
  4253. <b>20.5.3<tt> <b>remove</b></tt>, <b>remove_if</b>, <b>remove_copy</b> and 
  4254. <b>remove_copy_if 
  4255. </b></b><br>
  4256. <a href="^Code::c:s0p14"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.28</a> demonstrates removing values from a 
  4257. sequence using the Standard Library functions <b>remove</b>, 
  4258. <tt><b>remove_if</b></tt>, <tt><b>remove_copy</b></tt> and <b>remove_copy_if</b>.<br>
  4259. <spacer width=16 height=1>Line 23<br>
  4260. <font size=2><br></font><font size=11><pre>
  4261. newLastElement = remove( v.begin(), v.end(), 10 );<p>
  4262. </pre></font>
  4263. uses function <b>remove</b> to eliminate all elements with the 
  4264. value <b>10</b> in the range <b>v.begin()</b> up to, but not including, 
  4265. <b>v.end()</b> from the <b>vector v</b>. The first two iterator 
  4266. arguments must be forward iterators so the algorithm 
  4267. can modify the elements in the sequence. This function 
  4268. does not modify the number of elements in the <b>vector</b> <br>
  4269.  
  4270. </page>
  4271. <page pagename="20.5.3<tt> <b>remove</b></tt>, <b>remove_if</b>, <b>remove_copy</b> and ">
  4272. nor destroy the eliminated elements, but it does move 
  4273. all elements that are not eliminated toward the 
  4274. beginning of the <b>vector</b>. The function returns an iterator 
  4275. positioned after the last <b>vector</b> element that was not 
  4276. deleted. Elements from the iterator position to the end 
  4277. of the <b>vector</b> have undefined values (in this example, 
  4278. each "undefined" position has value 0).<br>
  4279. <spacer width=16 height=1>Line 33<br>
  4280. <font size=2><br></font><font size=11><pre>
  4281. remove_copy( v2.begin(), v2.end(), c.begin(),<p>
  4282.      10 );<p>
  4283. </pre></font>
  4284. uses function <b>remove_copy</b> to copy all elements that do 
  4285. not have the value <b>10</b> in the range <b>v2.begin()</b> up to, but 
  4286. not including, <b>v2.end()</b> from the <b>vector v2</b>. The <br>
  4287.  
  4288. </page>
  4289. <page pagename="20.5.3<tt> <b>remove</b></tt>, <b>remove_if</b>, <b>remove_copy</b> and ">
  4290. elements are placed in <b>vector c</b> starting at position 
  4291. <b>c.begin()</b>. The iterators supplied as the first two 
  4292. arguments must be input iterators. The iterator supplied 
  4293. as the third argument must be an output iterator so the 
  4294. element being copied can be inserted into the copy 
  4295. location. This function returns an iterator positioned 
  4296. after the last element copied into <b>vector c</b>. Note on line 
  4297. 29 the use of the vector constructor that receives the 
  4298. number of elements in the <b>vector</b> and the initial value 
  4299. of those elements.<br>
  4300. <spacer width=16 height=1>Lines 42 and 43<br>
  4301. <font size=2><br></font><font size=11><pre>
  4302. newLastElement = remove_if( v3.begin(), v3.end(),<p>
  4303.      greater9 );<p>
  4304. </pre></font>
  4305.  
  4306. </page>
  4307. <page pagename="20.5.3<tt> <b>remove</b></tt>, <b>remove_if</b>, <b>remove_copy</b> and ">
  4308. uses function <b>remove_if</b> to delete all elements in the 
  4309. range <b>v3.begin() </b>up to, but not including, <b>v3.end()</b> from 
  4310. the <b>vector v3</b> for which our user-defined unary 
  4311. predicate function <b>greater9</b> returns <b>true</b>. Function 
  4312. <b>greater9</b> is defined at line 64 to return <b>true</b> if the value 
  4313. passed to it is greater than 9, and to return <b>false</b> 
  4314. otherwise. The iterators supplied as the first two 
  4315. arguments must be forward iterators so the algorithm 
  4316. can modify the elements in the sequence. This function 
  4317. does not modify the number of elements in the <b>vector</b>, 
  4318. but it does move to the beginning of the <b>vector</b> all 
  4319. elements that are not eliminated. This function returns 
  4320. an iterator positioned after the last element in the <b>vector</b> <br>
  4321.  
  4322. </page>
  4323. <page pagename="20.5.3<tt> <b>remove</b></tt>, <b>remove_if</b>, <b>remove_copy</b> and ">
  4324. that was not deleted. All elements from the iterator 
  4325. position to the end of the <b>vector</b> have undefined values. <br>
  4326. <spacer width=16 height=1>Lines 55 and 56<br>
  4327. <font size=2><br></font><font size=11><pre>
  4328. remove_copy_if( v4.begin(), v4.end(), <p>
  4329.                 c2.begin(), greater9 );<p>
  4330. </pre></font>
  4331. uses function <b>remove_copy_if </b>to copy all elements in 
  4332. the range <b>v4.begin() </b>up to, but not including, <b>v4.end()</b> 
  4333. from the <b>vector v4</b> for which the unary predicate 
  4334. function <b>greater9</b> returns <b>true</b>. The elements are placed 
  4335. in <b>vector c2</b> starting at position <b>c2.begin()</b>. The 
  4336. iterators supplied as the first two arguments must be 
  4337. input iterators. The iterator supplied as the third 
  4338. argument must be an output iterator so the element <br>
  4339.  
  4340. </page>
  4341. <page pagename="20.5.3<tt> <b>remove</b></tt>, <b>remove_if</b>, <b>remove_copy</b> and ">
  4342. being copied can be inserted into the copy location. 
  4343. This function returns an iterator positioned after the last 
  4344. element copied into <b>vector c2</b>.<br>
  4345.  
  4346. </page>
  4347. <page pagename="20.5.3<tt> <b>remove</b></tt>, <b>remove_if</b>, <b>remove_copy</b> and ">
  4348. <b>Drag the correct term to the box associated with the 
  4349. attribute:</b><br>
  4350. <component type="drag" width=48 height=18 label="remove" name="remove">    <component type="drag" width=72 height=18 label="remove_if" name="remove_if">   <component type="drag" width=88 height=18 label="remove_copy" name="remove_copy">   <br>
  4351. Deletes all elements with a specific value when a predicate function returns true.<component type="drop" width=96 height=18 name="remove_if">  <br>
  4352. Copies elements that do not have a specific value.<component type="drop" width=96 height=18 name="remove_copy">  <br>
  4353. Deletes all elements with a specific value.<component type="drop" width=96 height=18 name="remove">  <br>
  4354. <component type=button name=b label="Check Your Answer" width=125 height=24>
  4355.  
  4356. </page>
  4357. <page pagename="20.5.4 <tt> <b>replace</b></tt>, <b>replace_if</b>, <b>replace_copy</b> and ">
  4358. <b>replace_copy_if</b> 
  4359. <b>20.5.4 <tt> <b>replace</b></tt>, <b>replace_if</b>, <b>replace_copy</b> and 
  4360. <b>replace_copy_if</b> </b><br>
  4361. <a href="^Code::c:s0p15"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.29</a> demonstrates replacing values from a 
  4362. sequence using the Standard Library functions <b>replace</b>, 
  4363. <b>replace_if</b>, <b>replace_copy</b> and <b>replace_copy_if</b>. <br>
  4364. <spacer width=16 height=1>Line 22<br>
  4365. <font size=2><br></font><font size=11><pre>
  4366. replace( v1.begin(), v1.end(), 10, 100 );<p>
  4367. </pre></font>
  4368. uses function <b>replace</b> to replace all elements with the 
  4369. value <b>10</b> in the range <b>v1.begin()</b> up to, but not 
  4370. including, <b>v1.end()</b> from the <b>vector v1</b> with the new 
  4371. value <b>100</b>. The iterators supplied as the first two 
  4372. arguments must be forward iterators so the algorithm 
  4373. can modify the elements in the sequence.<br>
  4374.  
  4375. </page>
  4376. <page pagename="20.5.4 <tt> <b>replace</b></tt>, <b>replace_if</b>, <b>replace_copy</b> and ">
  4377. Lines 32 and 33<br>
  4378. <font size=2><br></font><font size=11><pre>
  4379. replace_copy( v2.begin(), v2.end(),<p>
  4380.     c1.begin(), 10, 100 );<p>
  4381. </pre></font>
  4382. uses function <b>replace_copy</b> to copy all elements in the 
  4383. range <b>v2.begin() </b>up to, but not including, <b>v2.end()</b> from 
  4384. the <b>vector v2</b> replacing all elements with the value <b>10</b> 
  4385. with the new value <b>100</b>. The elements are copied into 
  4386. <b>vector c1</b> starting at position <b>c1.begin()</b>. The iterators 
  4387. supplied as the first two arguments must be input 
  4388. iterators. The iterator supplied as the third argument 
  4389. must be an output iterator so the element being copied 
  4390. can be inserted into the copy location. This function <br>
  4391.  
  4392. </page>
  4393. <page pagename="20.5.4 <tt> <b>replace</b></tt>, <b>replace_if</b>, <b>replace_copy</b> and ">
  4394. returns an iterator positioned after the last element 
  4395. copied into <b>vector c2</b>.<br>
  4396. <spacer width=16 height=1>Line 42<br>
  4397. <font size=2><br></font><font size=11><pre>
  4398. replace_if( v3.begin(), v3.end(), greater9, 100 );<p>
  4399. </pre></font>
  4400. uses function <b>replace_if</b> to replace all elements in the 
  4401. range <b>v3.begin()</b> up to, but not including, <b>v3.end()</b> from 
  4402. the <b>vector v3</b> for which the unary predicate function 
  4403. <b>greater9 </b>returns <b>true</b>. Function <b>greater9</b> is defined at 
  4404. line 63 to return <b>true</b> if the value passed to it is greater 
  4405. than 9 and <b>false</b> otherwise. The value <b>100</b> replaces each 
  4406. value greater than 9. The iterators supplied as the first 
  4407. two arguments must be forward iterators so the 
  4408. algorithm can modify the elements in the sequence. <br>
  4409.  
  4410. </page>
  4411. <page pagename="20.5.4 <tt> <b>replace</b></tt>, <b>replace_if</b>, <b>replace_copy</b> and ">
  4412. Lines 53 and 54<br>
  4413. <font size=2><br></font><font size=11><pre>
  4414. replace_copy_if( v4.begin(), v4.end(),<p>
  4415.      c2.begin(), greater9, 100 );<p>
  4416. </pre></font>
  4417. uses function <b>replace_copy_if </b>to copy all elements in 
  4418. the range <b>v4.begin() </b>up to, but not including, <b>v4.end()</b> 
  4419. from the <b>vector v4</b>. Elements for which the unary 
  4420. predicate function <b>greater9</b> returns <b>true</b> are replaced 
  4421. with the value <b>100</b>. The elements are placed in <b>vector 
  4422. c2</b> starting at position <b>c2.begin()</b>. The iterators supplied 
  4423. as the first two arguments must be input iterators. The 
  4424. iterator supplied as the third argument must be an 
  4425. output iterator so the element being copied can be 
  4426. inserted into the copy location. This function returns an <br>
  4427.  
  4428. </page>
  4429. <page pagename="20.5.4 <tt> <b>replace</b></tt>, <b>replace_if</b>, <b>replace_copy</b> and ">
  4430. iterator positioned after the last element copied into 
  4431. <b>vector c2</b>.<br>
  4432.  
  4433. </page>
  4434. <page pagename="20.5.4 <tt> <b>replace</b></tt>, <b>replace_if</b>, <b>replace_copy</b> and ">
  4435. <b>Drag the correct term to the box associated with the 
  4436. attribute:</b><br>
  4437. <component type="drag" width=96 height=18 label="replace_copy" name="replace_copy">   <component type="drag" width=80 height=18 label="replace_if" name="replace_if">   <component type="drag" width=56 height=18 label="replace" name="replace">    <br>
  4438. Replace all elements with a value.<component type="drop" width=104 height=18 name="replace">  <br>
  4439. Replaces all elements with a specific value when a predicate function returns true.<component type="drop" width=104 height=18 name="replace_if">  <br>
  4440. Copy elements from a sequence replacing a specific value. <component type="drop" width=104 height=18 name="replace_copy">  <br>
  4441. <component type=button name=b label="Check Your Answer" width=125 height=24>
  4442.  
  4443. </page>
  4444. <page pagename="20.5.5 Mathematical Algorithms">
  4445. <b>20.5.5 Mathematical Algorithms</b><br>
  4446. <a href="^Code::c:s0p16"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.30</a> demonstrates some common mathematical 
  4447. algorithms from the Standard Library including 
  4448. <b>random_shuffle</b>, <b>count</b>, <b>count_if</b>, <b>min_element</b>, 
  4449. <b>max_element</b>, <b>accumulate</b>, <b>for_each</b> and <b>transform</b>.<br>
  4450. <spacer width=16 height=1>Line 23<br>
  4451. <font size=2><br></font><font size=11><pre>
  4452. random_shuffle( v.begin(), v.end() );<p>
  4453. </pre></font>
  4454. uses function <b>random_shuffle</b> to randomly order the 
  4455. elements in the range <b>v.begin()</b> up to, but not including, 
  4456. <b>v.end()</b> in <b>vector v</b>. This function takes two random-
  4457. access iterator arguments.<br>
  4458. <spacer width=16 height=1>Line 31<br>
  4459. <font size=2><br></font><font size=11><pre>
  4460. int result = count( v2.begin(), v2.end(), 8 );<p>
  4461. </pre></font>
  4462.  
  4463. </page>
  4464. <page pagename="20.5.5 Mathematical Algorithms">
  4465. uses function <b>count</b> to count the elements with the 
  4466. value <b>8</b> in the range <b>v2.begin()</b> up to, but not including, 
  4467. <b>v2.end()</b> in <b>vector v2</b>. This function requires its two 
  4468. iterator arguments to be at least input iterators.<br>
  4469. Line 34<br>
  4470. <font size=2><br></font><font size=11><pre>
  4471. result = count_if( v2.begin(), v2.end(), <p>
  4472.     greater9 );<p>
  4473. </pre></font>
  4474. uses function <b>count_if</b> to count elements in the range 
  4475. <b>v2.begin()</b> up to, but not including, <b>v2.end()</b> in <b>vector 
  4476. v2</b> for which the predicate function <b>greater9</b> returns 
  4477. <b>true</b>. Function <b>count_if</b> requires its two iterator 
  4478. arguments to be at least input iterators.<br>
  4479. <spacer width=16 height=1>Lines 37 and 38<br>
  4480.  
  4481. </page>
  4482. <page pagename="20.5.5 Mathematical Algorithms">
  4483. <font size=2><br></font><font size=11><pre>
  4484. cout << "\n\nMinimum element in Vector v2 is: "<p>
  4485. </pre></font>
  4486. <font size=2><br></font><font size=11><pre>
  4487.      << *( min_element( v2.begin(), v2.end() ) );<p>
  4488. </pre></font>
  4489. uses function <b>min_element</b> to locate the smallest 
  4490. element in the range <b>v2.begin()</b> up to, but not including, 
  4491. <b>v2.end()</b> in <b>vector v2</b>. The function returns an input 
  4492. iterator located at the smallest element, or if the  <a href="^Practice::c:s0p1"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>range 
  4493. is empty, returns the iterator itself. The function 
  4494. requires its two iterator arguments to be at least input 
  4495. iterators. A second version of this function takes as its 
  4496. third argument a binary function that compares the 
  4497. elements in the sequence. The binary function takes two 
  4498. arguments and returns a <b>bool</b> value.<br>
  4499. <spacer width=16 height=1>Lines 40 and 41<br>
  4500.  
  4501. </page>
  4502. <page pagename="20.5.5 Mathematical Algorithms">
  4503. <font size=2><br></font><font size=11><pre>
  4504. cout << "\nMaximum element in Vector v2 is: "<p>
  4505. </pre></font>
  4506. <font size=2><br></font><font size=11><pre>
  4507.      << *( max_element( v2.begin(), v2.end() ) );<p>
  4508. </pre></font>
  4509. uses function <b>max_element</b> to locate the largest 
  4510. element in the range <b>v2.begin()</b> up to, but not including, 
  4511. <b>v2.end()</b> in <b>vector v2</b>. The function returns an input 
  4512. iterator located at the largest element. The function 
  4513. requires its two iterator arguments to be at least input 
  4514. iterators. A second version of this function takes as its 
  4515. third argument a binary predicate function that 
  4516. compares the elements in the sequence. The binary 
  4517. function takes two arguments and returns a <b>bool</b> value.<br>
  4518. <spacer width=16 height=1>Lines 43 and 44<br>
  4519.  
  4520. </page>
  4521. <page pagename="20.5.5 Mathematical Algorithms">
  4522. <font size=2><br></font><font size=11><pre>
  4523. cout << "\n\nThe total of the elements in <p>
  4524.     Vector v is: "<p>
  4525. </pre></font>
  4526. <font size=2><br></font><font size=11><pre>
  4527.      << accumulate( v.begin(), v.end(), 0 );<p>
  4528. </pre></font>
  4529. uses function <b>accumulate</b> (the prototype of which is in 
  4530. header file <tt><b><numeric></b></tt>) to sum the values in the range 
  4531. <b>v.begin()</b> up to, but not including, <b>v.end()</b> in <b>vector v</b>. 
  4532. The function's two iterator arguments must be at least 
  4533. input iterators. A second version of this function takes 
  4534. as its third argument a general function that determines 
  4535. how elements are accumulated. The general function 
  4536. must take two arguments and return a result. The first 
  4537. argument to this function is the current value of the 
  4538. accumulation. The second argument is the value of the <br>
  4539.  
  4540. </page>
  4541. <page pagename="20.5.5 Mathematical Algorithms">
  4542. current element in the sequence being accumulated. For 
  4543. example, to accumulate the sum of the squares of every 
  4544. element, you could use the function<br>
  4545. <font size=2><br></font><font size=11><pre>
  4546. int sumOfSquares( int accumulator, int<p>
  4547.      currentValue )<p>
  4548. {<p>
  4549.    return accumulator + currentValue *<p>
  4550.        currentValue;<p>
  4551. }<p>
  4552. </pre></font>
  4553. Line 47<br>
  4554. <font size=2><br></font><font size=11><pre>
  4555. for_each( v.begin(), v.end(), outputSquare );<p>
  4556. </pre></font>
  4557. uses function <b>for_each</b> to apply a general function to 
  4558. every element in the range <b>v.begin()</b> up to, but not <br>
  4559.  
  4560. </page>
  4561. <page pagename="20.5.5 Mathematical Algorithms">
  4562. including, <b>v.end()</b> in <b>vector v</b>. The general function 
  4563. should take the current element as an argument and 
  4564. should not modify that element. Function <b>for_each</b> 
  4565. requires its two iterator arguments to be at least input 
  4566. iterators. <br>
  4567. <spacer width=16 height=1>Lines 50 and 51<br>
  4568. <font size=2><br></font><font size=11><pre>
  4569. transform( v.begin(), v.end(), cubes.begin(),<p>
  4570.            calculateCube );<p>
  4571. </pre></font>
  4572. use function <b>transform</b> to apply a general function to 
  4573. every element in the range <b>v.begin()</b> up to, but not 
  4574. including, <b>v.end()</b> in <b>vector v</b>. The general function (the 
  4575. fourth argument) should take the current element as an 
  4576. argument, should not modify the element and should <br>
  4577.  
  4578. </page>
  4579. <page pagename="20.5.5 Mathematical Algorithms">
  4580. return the <b>transformed</b> value. Function <b>transform</b> 
  4581. requires its first two iterator arguments to be at least 
  4582. input iterators and its third argument must be at least an 
  4583. output iterator. The third argument specifies where the 
  4584. <b>transformed</b> values should be placed. Note that the 
  4585. third argument can equal the first.<br>
  4586.  
  4587. </page>
  4588. <page pagename="20.5.5 Mathematical Algorithms">
  4589. <b>Select the true statement(s). </b><br>
  4590. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4591. Function random_shuffle randomly changes the order of the elements and takes two random-access iterators as arguments.   <br>
  4592. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Function accumulate does sum the values in a sequence, but it is defined in <numeric>.">
  4593. Function accumulate sums the values in a sequence and is defined in <algorithm>.   <br>
  4594. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4595. Function transform applies a general function to every element in the specified range and modifies the value.   <br>
  4596. <component type=button name=b label="Check Your Answer" width=125 height=24>
  4597.  
  4598. </page>
  4599. <page pagename="20.5.6 Basic Searching and Sorting Algorithms">
  4600. <b>20.5.6 Basic Searching and Sorting Algorithms</b><br>
  4601. <a href="^Code::c:s0p17"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.31</a> demonstrates some basic searching and 
  4602. sorting capabilities of the Standard Library including 
  4603. <b>find</b>, <b>find_if</b>, <b>sort</b> and <b>binary_search</b>.<br>
  4604. <spacer width=16 height=1>Line 22<br>
  4605. <font size=2><br></font><font size=11><pre>
  4606. location = find( v.begin(), v.end(), 16 );<p>
  4607. </pre></font>
  4608. uses function <b>find</b> to locate the value <b>16</b> in the range 
  4609. <b>v.begin()</b> up to, but not including, <b>v.end()</b> in <b>vector v</b>. 
  4610. The function requires its two iterator arguments to be at 
  4611. least input iterators. The function returns an input 
  4612. iterator that is positioned either at the first element 
  4613. containing the value or an iterator indicating the end of 
  4614. the sequence. <br>
  4615.  
  4616. </page>
  4617. <page pagename="20.5.6 Basic Searching and Sorting Algorithms">
  4618. Line 38<br>
  4619. <font size=2><br></font><font size=11><pre>
  4620. location = find_if( v.begin(), v.end(), <p>
  4621.     greater10 );<p>
  4622. </pre></font>
  4623. uses function <b>find_if</b> to locate the first value in the 
  4624. range <b>v.begin()</b> up to, but not including, <b>v.end()</b> in 
  4625. <b>vector v</b> for which the unary predicate function 
  4626. <b>greater10</b> returns <b>true</b>. Function <b>greater10</b> is defined 
  4627. at line 65 to take an integer and return a <b>bool</b> value 
  4628. indicating if the integer argument is greater than 10. 
  4629. Function <b>find_if</b> requires its two iterator arguments to 
  4630. be at least input iterators. The function returns an input 
  4631. iterator that is positioned either at the first element 
  4632. containing a value for which the predicate function <br>
  4633.  
  4634. </page>
  4635. <page pagename="20.5.6 Basic Searching and Sorting Algorithms">
  4636. returns <b>true</b> or an iterator indicating the end of the 
  4637. sequence. <br>
  4638. <spacer width=16 height=1>Line 47<br>
  4639. <font size=2><br></font><font size=11><pre>
  4640. sort( v.begin(), v.end() );<p>
  4641. </pre></font>
  4642. uses function <b>sort</b> to arrange the elements in the range 
  4643. <b>v.begin()</b> up to, but not including, <b>v.end() </b>in <b>vector v</b> in 
  4644. ascending order. The function requires its two  <a href="^Errors::c:s0p4"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>iterator 
  4645. arguments to be random-access iterators. A second 
  4646. version of this function takes a third argument that is a 
  4647. binary predicate function taking two arguments that are 
  4648. values in the sequence and returning a <b>bool</b> indicating 
  4649. the sorting order--if the return value is <b>true</b> the two 
  4650. elements being compared are in sorted order.<br>
  4651.  
  4652. </page>
  4653. <page pagename="20.5.6 Basic Searching and Sorting Algorithms">
  4654. Line 51<br>
  4655. <font size=2><br></font><font size=11><pre>
  4656. if ( binary_search( v.begin(), v.end(), 13 ) )<p>
  4657. </pre></font>
  4658. uses function <b>binary_search</b> to determine if the value 
  4659. 13 is in the range <b>v.begin()</b> up to, but not including, 
  4660. <b>v.end()</b> in <b>vector v</b>. The sequence of values must be 
  4661. sorted in ascending order first. Function <b>binary_search</b> 
  4662. requires its two iterator arguments to be at least forward 
  4663. iterators. The function returns a <b>bool</b> indicating whether 
  4664. or not the value was found in the sequence. A second 
  4665. version of this function takes a fourth argument that is a 
  4666. binary predicate function taking two arguments that are 
  4667. values in the sequence and returning a <b>bool</b>. The <br>
  4668.  
  4669. </page>
  4670. <page pagename="20.5.6 Basic Searching and Sorting Algorithms">
  4671. predicate function returns <b>true</b> if the two elements 
  4672. being compared are in sorted order.<br>
  4673.  
  4674. </page>
  4675. <page pagename="20.5.6 Basic Searching and Sorting Algorithms">
  4676. <b>Select the true statement(s). </b><br>
  4677. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Function sort requires a random-access iterator.">
  4678. Function sort can be passed any iterator.   <br>
  4679. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4680. Function find returns an input iterator that is positioned either at the first element containing the value or an iterator indicating the end of sequence.   <br>
  4681. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4682. Function binary_search requires at least two forward iterators.   <br>
  4683. <component type=button name=b label="Check Your Answer" width=125 height=24>
  4684.  
  4685. </page>
  4686. <page pagename="20.5.7 <b>swap</b>, <b>iter_swap</b> and <b>swap_ranges </b> ">
  4687. <b>20.5.7 <b>swap</b>, <b>iter_swap</b> and <b>swap_ranges </b> </b><br>
  4688. <a href="^Code::c:s0p18"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.32</a> demonstrates functions <b>swap</b>, <b>iter_swap</b> 
  4689. and <b>swap_ranges</b> for swapping elements.<br>
  4690. Line 17<br>
  4691. <font size=2><br></font><font size=11><pre>
  4692. swap( a[ 0 ], a[ 1 ] );<p>
  4693. </pre></font>
  4694. uses function <tt><b>swap</b></tt> to exchange two values. In this 
  4695. example, the first and second elements of array <tt><b>a</b></tt> are 
  4696. exchanged. The function takes as arguments references 
  4697. to the two values being exchanged.<br>
  4698. <spacer width=16 height=1>Line 22<br>
  4699. <font size=2><br></font><font size=11><pre>
  4700. iter_swap( &a[ 0 ], &a[ 1 ] );<p>
  4701. </pre></font>
  4702.  
  4703. </page>
  4704. <page pagename="20.5.7 <b>swap</b>, <b>iter_swap</b> and <b>swap_ranges </b> ">
  4705. uses function <b>iter_swap</b> to exchange the two elements. 
  4706. The function takes two forward iterator arguments (in 
  4707. this case, pointers to elements of an array) and 
  4708. exchanges the values in the elements to which the 
  4709. iterators refer.<br>
  4710. <spacer width=16 height=1>Line 27<br>
  4711. <font size=2><br></font><font size=11><pre>
  4712. swap_ranges( a, a + 5, a + 5 );<p>
  4713. </pre></font>
  4714. uses function <b>swap_ranges</b> to exchange the elements in 
  4715. the range <b>a</b> up to, but not including, <b>a + 5</b> with the 
  4716. elements beginning at position <b>a + 5</b>. The function 
  4717. requires three forward iterator arguments. The first two 
  4718. arguments specify the range of elements in the first 
  4719. sequence that will be exchanged with the elements in <br>
  4720.  
  4721. </page>
  4722. <page pagename="20.5.7 <b>swap</b>, <b>iter_swap</b> and <b>swap_ranges </b> ">
  4723. the second sequence starting from the iterator in the 
  4724. third argument. In this example, the two sequences of 
  4725. values are in the same array, but the sequences can be 
  4726. from different arrays or containers.<br>
  4727.  
  4728. </page>
  4729. <page pagename="20.5.7 <b>swap</b>, <b>iter_swap</b> and <b>swap_ranges </b> ">
  4730. <b>Select the true statement(s). </b><br>
  4731. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4732. Function iter_swap exchanges two elements.   <br>
  4733. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  4734. Function swap_ranges exchanges two sequences of elements.   <br>
  4735. <component type=button name=b label="Check Your Answer" width=125 height=24>
  4736.  
  4737. </page>
  4738. <page pagename="20.5.8 <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse </b> ">
  4739. <b>20.5.8 <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse </b> </b><br>
  4740. <a href="^Code::c:s0p19"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.33</a> demonstrates Standard Library functions 
  4741. <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse</b>. <br>
  4742. <spacer width=16 height=1>Line 26<br>
  4743. <font size=2><br></font><font size=11><pre>
  4744. copy_backward( v1.begin(), v1.end(),<p>
  4745.      results.end() );<p>
  4746. </pre></font>
  4747. uses function <b>copy_backward</b> to copy elements in the 
  4748. range <b>v1.begin()</b> up to, but not including, <b>v1.end()</b> in 
  4749. <b>vector v1</b> and place the elements in <b>vector results</b> 
  4750. starting from the element before <b>results.end()</b> and 
  4751. working toward the beginning of the <b>vector</b>. The 
  4752. function returns an iterator positioned at the last 
  4753. element copied into the <b>vector results</b> (i.e., the <br>
  4754.  
  4755. </page>
  4756. <page pagename="20.5.8 <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse </b> ">
  4757. beginning of <b>results</b> because we are going backwards). 
  4758. The elements are placed in <b>results</b> in the same order as 
  4759. <b>v1</b>. This function requires three bidirectional iterator 
  4760. arguments (iterators that can be incremented and 
  4761. decremented to iterate forwards and backwards through 
  4762. a sequence, respectively). The main difference between 
  4763. <b>copy</b> and <b>copy_backward</b> is that the iterator returned 
  4764. from <b>copy</b> is positioned <i>after</i> the last element copied 
  4765. and the iterator returned from <b>copy_backward</b> is 
  4766. positioned <i>at</i> the last element copied (which is really 
  4767. the first element in the sequence). Also, <b>copy</b> requires 
  4768. two input iterators and an output iterator as argument.<br>
  4769. <spacer width=16 height=1>Lines 31 and 32<br>
  4770.  
  4771. </page>
  4772. <page pagename="20.5.8 <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse </b> ">
  4773. <font size=2><br></font><font size=11><pre>
  4774. merge( v1.begin(), v1.end(), v2.begin(),<p>
  4775.      v2.end(), results2.begin() );<p>
  4776. </pre></font>
  4777. use function <b>merge</b> to combine two sorted ascending 
  4778. sequences of values into a third sorted ascending 
  4779. sequence. The function requires five iterator arguments. 
  4780. The first four arguments must be at least input iterators 
  4781. and the last argument must be at least an output iterator. 
  4782. The first two arguments specify the range of elements 
  4783. in the first sorted sequence (<b>v1</b>), the second two 
  4784. arguments specify the range of elements in the second 
  4785. sorted sequence (<b>v2</b>) and the last argument specifies the 
  4786. starting location in the third sequence (<b>results2</b>) where 
  4787. the elements will be merged. A second version of this <br>
  4788.  
  4789. </page>
  4790. <page pagename="20.5.8 <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse </b> ">
  4791. function takes as its fifth argument a binary predicate 
  4792. function that specifies the sorting order.<br>
  4793. <spacer width=16 height=1>Note that line 30 creates vector results with the number 
  4794. of elements <b>v1.size() + v2.size()</b>. Using the <b>merge</b> 
  4795. function as shown here requires that the sequence 
  4796. where the results are stored be at least the size of the 
  4797. two sequences being merged. If you do not want to 
  4798. allocate the number of elements for the resulting 
  4799. sequence before the <b>merge</b> operation, you can use the 
  4800. following statements<br>
  4801. <font size=2><br></font><font size=11><pre>
  4802. vector< int > results2();<p>
  4803. merge ( v1.begin(), v1.end(), v2.begin(),<p>
  4804.      v2.end(), back_inserter( results2 ) ); <p>
  4805. </pre></font>
  4806.  
  4807. </page>
  4808. <page pagename="20.5.8 <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse </b> ">
  4809. The argument <b>back_inserter( results2 )</b> uses function 
  4810. template <b>back_inserter</b> (header file <b><iterator></b>) for the 
  4811. container <b>results2</b>. A <b>back_inserter</b> calls the 
  4812. container's default <b>push_back</b> function to insert an 
  4813. element at the end of the container. More importantly, if 
  4814. an element is inserted into a container that has no more 
  4815. elements available, the container automatically grows 
  4816. in size. Thus, the number of elements in the container 
  4817. does not have to be known in advance. There are two 
  4818. other inserters--<b>front_inserter</b> (to insert an element at 
  4819. the beginning of a container specified as its argument) 
  4820. and <b>inserter</b> (to insert an element before the iterator <br>
  4821.  
  4822. </page>
  4823. <page pagename="20.5.8 <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse </b> ">
  4824. supplied as its second argument in the container 
  4825. supplied as its first argument).<br>
  4826. <spacer width=16 height=1>Line 37<br>
  4827. <font size=2><br></font><font size=11><pre>
  4828. endLocation = unique( results2.begin(),<p>
  4829.      results2.end() );<p>
  4830. </pre></font>
  4831. uses function <b>unique</b> on the sorted sequence of 
  4832. elements in the range <b>results2.begin()</b> up to, but not 
  4833. including, <b>results2.end() </b>in <b>vector results2</b>. After this 
  4834. function is applied to a sorted sequence with duplicate 
  4835. values, only a single copy of each value remains in the 
  4836. sequence. The function takes two arguments that must 
  4837. be at least forward iterators. The function returns an 
  4838. iterator positioned after the last element in the sequence <br>
  4839.  
  4840. </page>
  4841. <page pagename="20.5.8 <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse </b> ">
  4842. of unique values. The values of all elements in the 
  4843. container after the last unique value are undefined. A 
  4844. second version of this function takes as a third 
  4845. argument a binary predicate function specifying how to 
  4846. compare two elements for equality.<br>
  4847. <spacer width=16 height=1>Line 42<br>
  4848. <font size=2><br></font><font size=11><pre>
  4849. reverse( v1.begin(), v1.end() );<p>
  4850. </pre></font>
  4851. uses function <b>reverse</b> to reverse all the elements in the 
  4852. range <b>v1.begin()</b> up to, but not including, <b>v1.end()</b> in 
  4853. <b>vector v1</b>. The function takes two arguments that must 
  4854. be at least bidirectional iterators.<br>
  4855.  
  4856. </page>
  4857. <page pagename="20.5.8 <b>copy_backward</b>, <b>merge</b>, <b>unique</b> and <b>reverse </b> ">
  4858. <b>Drag the correct term to the box associated with the 
  4859. attribute:</b><br>
  4860. <component type="drag" width=104 height=18 label="copy_backward" name="copy_backward">    <component type="drag" width=40 height=18 label="merge" name="merge">   <component type="drag" width=56 height=18 label="reverse" name="reverse">   <component type="drag" width=48 height=18 label="unique" name="unique">   <br>
  4861. Combines two sorted ascending sequences of values into a third sorted ascending sequence.<component type="drop" width=112 height=18 name="merge">  <br>
  4862. After copying a sequence, returns an iterator positioned at the beginning of a sequence.<component type="drop" width=112 height=18 name="copy_backward">  <br>
  4863. Eliminates duplicates in a sequence.<component type="drop" width=112 height=18 name="unique">  <br>
  4864. Reverses all elements in a given range.<component type="drop" width=112 height=18 name="reverse">  <br>
  4865. <component type=button name=b label="Check Your Answer" width=125 height=24>
  4866.  
  4867. </page>
  4868. <page pagename="20.5.9 <b>inplace_merge</b>, <b>unique_copy</b> and ">
  4869. <b>reverse_copy</b>  
  4870. <b>20.5.9 <b>inplace_merge</b>, <b>unique_copy</b> and 
  4871. <b>reverse_copy</b>  </b><br>
  4872. The program of <a href="^Code::c:s0p20"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 20.34</a> demonstrates Standard 
  4873. Library functions <tt><b>inplace_merge</b></tt>, <b>unique_copy</b> and 
  4874. <b>reverse_copy</b>. <br>
  4875. Line 22<br>
  4876. <font size=2><br></font><font size=11><pre>
  4877. inplace_merge( v1.begin(), v1.begin() + 5,<p>
  4878.      v1.end() );<p>
  4879. </pre></font>
  4880. uses function <b>inplace_merge</b> to merge two sorted 
  4881. sequences of elements in the same container. In this 
  4882. example, the elements from <b>v1.begin()</b> up to, but not 
  4883. including, <b>v1.begin() + 5</b> are merged with the elements 
  4884. from <b>v1.begin() + 5 </b>up to, but not including, <b>v1.end()</b>. <br>
  4885.  
  4886. </page>
  4887. <page pagename="20.5.9 <b>inplace_merge</b>, <b>unique_copy</b> and ">
  4888. This function requires its three iterator arguments to be 
  4889. at least bidirectional iterators. A second version of this 
  4890. function takes as a fourth argument a binary predicate 
  4891. function for comparing elements in the two sequences.<br>
  4892. <spacer width=16 height=1>Lines 27 and 28<br>
  4893. <font size=2><br></font><font size=11><pre>
  4894. unique_copy( v1.begin(), v1.end(), <p>
  4895.              back_inserter( results1 ) );<p>
  4896. </pre></font>
  4897. uses function <b>unique_copy</b> to make a copy of all the 
  4898. unique elements in the sorted sequence of values from 
  4899. <b>v1.begin()</b> up to, but not including, <b>v1.end()</b>. The 
  4900. copied elements are placed into vector <b>results1</b>. The 
  4901. first two arguments must be at least input iterators and 
  4902. the last argument must be at least an output iterator. In <br>
  4903.  
  4904. </page>
  4905. <page pagename="20.5.9 <b>inplace_merge</b>, <b>unique_copy</b> and ">
  4906. this example, we did not pre-allocate enough elements 
  4907. in <b>results1</b> to store all the elements copied from <b>v1</b>. 
  4908. Instead, we function <b>back_inserter</b> (defined in header 
  4909. file <b><iterator></b>) to add elements to the end of <b>vector 
  4910. v1</b>. The <b>back_inserter</b> uses class <b>vector's</b> capability to 
  4911. insert elements at the end of the <b>vector</b>. Because the 
  4912. <b>back_inserter</b> inserts an element rather than replacing 
  4913. an existing element's value, the <b>vector</b> is able to grow 
  4914. to accommodate additional elements. A second version 
  4915. of the <b>unique_copy</b> function takes as a fourth argument 
  4916. a binary predicate function for comparing elements for 
  4917. equality.<br>
  4918. <spacer width=16 height=1>Lines 34 and 35<br>
  4919.  
  4920. </page>
  4921. <page pagename="20.5.9 <b>inplace_merge</b>, <b>unique_copy</b> and ">
  4922. <font size=2><br></font><font size=11><pre>
  4923. reverse_copy( v1.begin(), v1.end(),<p>
  4924.      back_inserter( results2 ) );<p>
  4925. </pre></font>
  4926. uses function <b>reverse_copy</b> to make a reversed copy of 
  4927. the elements in the range <b>v1.begin()</b> up to, but not 
  4928. including, <b>v1.end()</b>. The copied elements are inserted 
  4929. into the <b>vector results2</b> using a <b>back_inserter</b> object to 
  4930. ensure that the <b>vector</b> can grow to accommodate the 
  4931. appropriate number of elements copied. The 
  4932. <b>reverse_copy</b> function requires its first two iterator 
  4933. arguments to be at least bidirectional iterators and its 
  4934. third iterator argument to be at least an output iterator.<br>
  4935.  
  4936. </page>
  4937. <page pagename="20.5.9 <b>inplace_merge</b>, <b>unique_copy</b> and ">
  4938. <b>Drag the correct term to the box associated with the 
  4939. attribute:</b><br>
  4940. <component type="drag" width=88 height=18 label="unique_copy" name="unique_copy">    <component type="drag" width=104 height=18 label="inplace_merge" name="inplace_merge">   <component type="drag" width=96 height=18 label="reverse_copy" name="reverse_copy">  <br>
  4941. Copies elements in reverse order.<component type="drop" width=112 height=18 name="reverse_copy">  <br>
  4942. Combines two sequences of elements in the same container.<component type="drop" width=112 height=18 name="inplace_merge">  <br>
  4943. Copies all unique elements in a sequence.<component type="drop" width=112 height=18 name="unique_copy">  <br>
  4944. <component type=button name=b label="Check Your Answer" width=125 height=24>
  4945.  
  4946. </page>
  4947. <page pagename="20.5.10 Set Operations">
  4948. <b>20.5.10 Set Operations</b><br>
  4949. <a href="^Code::c:s0p21"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.35</a> demonstrates Standard Library functions 
  4950. <b>includes</b>, <b>set_difference</b>, <b>set_intersection</b>, 
  4951. <b>set_symmetric_difference</b> and <b>set_union</b> for 
  4952. manipulating sets of sorted values. To demonstrate that 
  4953. Standard Library functions can be applied to arrays and 
  4954. containers, this example uses only arrays (remember a 
  4955. pointer into an array is a random-access iterator).<br>
  4956. <spacer width=16 height=1>Line 24 <br>
  4957. <font size=2><br></font><font size=11><pre>
  4958. if ( includes( a1, a1 + SIZE1, a2, a2 + SIZE2 ) )<p>
  4959. </pre></font>
  4960. calls function <b>includes</b> as the condition in an <b>if</b> 
  4961. structure. Function <b>includes</b> compares two sets of 
  4962. sorted values to determine if every element of the <br>
  4963.  
  4964. </page>
  4965. <page pagename="20.5.10 Set Operations">
  4966. second set is in the first set. If so, <b>includes</b> returns <b>true</b>; 
  4967. otherwise, <b>includes</b> returns <b>false</b>. The first two iterator 
  4968. arguments must be at least input iterators and describe 
  4969. the first set of values. In this example, the first set 
  4970. consists of the elements from <b>a1</b> up to, but not 
  4971. including, <b>a1 + SIZE1</b>. The last two iterator arguments 
  4972. must be at least input iterators and describe the second 
  4973. set of values. In this example, the second set consists of 
  4974. the elements from <b>a2</b> up to, but not including, <b>a2 + 
  4975. SIZE2</b>. A second version of function <b>includes</b> takes a 
  4976. fifth argument that is a binary predicate function for 
  4977. comparing elements for equality. <br>
  4978. Lines 35 and 36<br>
  4979.  
  4980. </page>
  4981. <page pagename="20.5.10 Set Operations">
  4982. <font size=2><br></font><font size=11><pre>
  4983. int *ptr = set_difference( a1, a1 + SIZE1, a2, a2<p>
  4984.      + SIZE2, difference );<p>
  4985. </pre></font>
  4986. uses function <b>set_difference</b> to determine the elements 
  4987. from the first set of sorted values that are not in the 
  4988. second set of sorted values (both sets of values must be 
  4989. in ascending order). The elements that are different are 
  4990. copied into the fifth argument (in this case the array 
  4991. <b>difference</b>). The first two iterator arguments must be at 
  4992. least input iterators for the first set of values. The next 
  4993. two iterator arguments must be at least input iterators 
  4994. for the second set of values. The fifth argument must be 
  4995. at least an output iterator indicating where to store a 
  4996. copy of the values that are different. The function <br>
  4997.  
  4998. </page>
  4999. <page pagename="20.5.10 Set Operations">
  5000. returns an output iterator positioned immediately after 
  5001. the last value copied into the set to which the fifth 
  5002. argument points. A second version of function 
  5003. <b>set_difference</b> takes a sixth argument that is a binary 
  5004. predicate function indicating the order in which the 
  5005. elements were originally sorted. The two sequences 
  5006. must be sorted using the same comparison function.<br>
  5007. <spacer width=16 height=1>Line 41 and 42<br>
  5008. <font size=2><br></font><font size=11><pre>
  5009. ptr = set_intersection( a1, a1 + SIZE1, a2, <p>
  5010.     a2 + SIZE2, intersection );<p>
  5011. </pre></font>
  5012. uses function <b>set_intersection</b> to determine the 
  5013. elements from the first set of sorted values that are in 
  5014. the second set of sorted values (both sets of values must <br>
  5015.  
  5016. </page>
  5017. <page pagename="20.5.10 Set Operations">
  5018. be in ascending order). The elements common to both 
  5019. sets are copied into the fifth argument (in this case the 
  5020. array <b>intersection</b>). The first two iterator arguments 
  5021. must be at least input iterators for the first set of values. 
  5022. The next two iterator arguments must be at least input 
  5023. iterators for the second set of values. The fifth argument 
  5024. must be at least an output iterator indicating where to 
  5025. store a copy of the values that are different. The 
  5026. function returns an output iterator positioned 
  5027. immediately after the last value copied into the set to 
  5028. which the fifth argument points. A second version of 
  5029. function <b>set_intersection</b> takes a sixth argument that is 
  5030. a binary predicate function indicating the order in <br>
  5031.  
  5032. </page>
  5033. <page pagename="20.5.10 Set Operations">
  5034. which the elements were originally sorted. The two 
  5035. sequences must be sorted using the same comparison 
  5036. function.<br>
  5037. <spacer width=16 height=1>Lines 47 and 48<br>
  5038. <font size=2><br></font><font size=11><pre>
  5039. ptr = set_symmetric_difference( a1, a1 + SIZE1,<p>
  5040.      a2, a2 + SIZE2, symmetric_difference );<p>
  5041. </pre></font>
  5042. uses function <b>set_symmetric_difference</b> to determine 
  5043. the elements in the first set that are not in the second set 
  5044. and the elements in the second set that are not in the 
  5045. first set (both sets of values must be in ascending 
  5046. order). The elements that are different are copied from 
  5047. both sets into the fifth argument (in this case the array 
  5048. <b>symmetric_difference</b>). The first two iterator <br>
  5049.  
  5050. </page>
  5051. <page pagename="20.5.10 Set Operations">
  5052. arguments must be at least input iterators for the first set 
  5053. of values. The next two iterator arguments must be at 
  5054. least input iterators for the second set of values. The 
  5055. fifth argument must be at least an output iterator 
  5056. indicating where to store a copy of the values that are 
  5057. different. The function returns an output iterator 
  5058. positioned immediately after the last value copied into 
  5059. the set to which the fifth argument points. A second 
  5060. version of function <b>set_symmetric_difference</b> takes a 
  5061. sixth argument that is a binary predicate function 
  5062. indicating the order in which the elements were 
  5063. originally sorted. The two sequences must be sorted 
  5064. using the same comparison function.<br>
  5065.  
  5066. </page>
  5067. <page pagename="20.5.10 Set Operations">
  5068. Line 53<br>
  5069. <font size=2><br></font><font size=11><pre>
  5070. ptr = set_union( a1, a1 + SIZE1, a3, a3 + SIZE2,<p>
  5071.      unionSet );<p>
  5072. </pre></font>
  5073. uses function <b>set_union</b> to create a set of all the 
  5074. elements that are in either or both of the two sorted sets 
  5075. (both sets of values must be in ascending order). The 
  5076. elements are copied from both sets into the fifth 
  5077. argument (in this case the array <b>unionSet</b>). Elements 
  5078. that appear in both sets are only copied from the first 
  5079. set. The first two iterator arguments must be at least 
  5080. input iterators for the first set of values. The next two 
  5081. iterator arguments must be at least input iterators for the 
  5082. second set of values. The fifth argument must be at least <br>
  5083.  
  5084. </page>
  5085. <page pagename="20.5.10 Set Operations">
  5086. an output iterator indicating where to store the copied 
  5087. elements. The function returns an output iterator 
  5088. positioned immediately after the last value copied into 
  5089. the set to which the fifth argument points. A second 
  5090. version of function <b>set_union</b> takes a sixth argument 
  5091. that is a binary predicate function indicating the order in 
  5092. which the elements were originally sorted. The two 
  5093. sequences must be sorted using the same comparison 
  5094. function.<br>
  5095.  
  5096. </page>
  5097. <page pagename="20.5.10 Set Operations">
  5098. <b>Drag the correct term to the box associated with the 
  5099. attribute:</b><br>
  5100. <component type="drag" width=112 height=18 label="set_difference" name="set_difference">    <component type="drag" width=128 height=18 label="set_intersection" name="set_intersection">   <component type="drag" width=72 height=18 label="set_union" name="set_union">   <br>
  5101. Determines the set of sorted values in the first set that are not in the second set of sorted values.<component type="drop" width=136 height=18 name="set_difference">  <br>
  5102. Creates a set of all the elements that are in either or both of the two sorted sets.<component type="drop" width=136 height=18 name="set_union">  <br>
  5103. Determines the set of values from the first set that are contained in the second set of values.<component type="drop" width=136 height=18 name="set_intersection">  <br>
  5104. <component type=button name=b label="Check Your Answer" width=125 height=24>
  5105.  
  5106. </page>
  5107. <page pagename="20.5.11<tt> <b>lower_bound</b></tt>, <b>upper_bound</b> and ">
  5108. <b>equal_range </b> 
  5109. <b>20.5.11<tt> <b>lower_bound</b></tt>, <b>upper_bound</b> and 
  5110. <b>equal_range </b> </b><br>
  5111. <a href="^Code::c:s0p22"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.36</a> demonstrates the <b>lower_bound</b>, 
  5112. <b>upper_bound</b> and <b>equal_range</b> Standard Library 
  5113. functions.<br>
  5114. Line 21<br>
  5115. <font size=2><br></font><font size=11><pre>
  5116. lower = lower_bound( v.begin(), v.end(), 6 );<p>
  5117. </pre></font>
  5118. uses function <b>lower_bound</b> to determine the first 
  5119. location in a sorted sequence of values at which the 
  5120. third argument could be inserted in the sequence and 
  5121. the sequence would still be sorted in ascending order. 
  5122. The first two iterator arguments must be at least 
  5123. forward iterators. The third argument is the value for <br>
  5124.  
  5125. </page>
  5126. <page pagename="20.5.11<tt> <b>lower_bound</b></tt>, <b>upper_bound</b> and ">
  5127. which to determine the lower bound. The function 
  5128. returns a forward iterator pointing to the position at 
  5129. which the insert can occur. A second version of 
  5130. function <b>lower_bound</b> takes as a fourth argument a 
  5131. binary predicate function indicating the order in which 
  5132. the elements were originally sorted.<br>
  5133. <spacer width=16 height=1>Line 26<br>
  5134. <font size=2><br></font><font size=11><pre>
  5135. upper = upper_bound( v.begin(), v.end(), 6 );<p>
  5136. </pre></font>
  5137. uses function <b>upper_bound</b> to determine the last 
  5138. location in a sorted sequence of values at which the 
  5139. third argument could be inserted in the sequence and 
  5140. the sequence would still be sorted in ascending order. 
  5141. The first two iterator arguments must be at least <br>
  5142.  
  5143. </page>
  5144. <page pagename="20.5.11<tt> <b>lower_bound</b></tt>, <b>upper_bound</b> and ">
  5145. forward iterators. The third argument is the value for 
  5146. which to determine the upper bound. The function 
  5147. returns a forward iterator pointing to the position at 
  5148. which the insert can occur. A second version of 
  5149. function <b>upper_bound</b> takes as a fourth argument a 
  5150. binary predicate function indicating the order in which 
  5151. the elements were originally sorted.<br>
  5152. <spacer width=16 height=1>Line 31<br>
  5153. <font size=2><br></font><font size=11><pre>
  5154. eq = equal_range( v.begin(), v.end(), 6 );<p>
  5155. </pre></font>
  5156. uses function <b>equal_range</b> to return a <b>pair</b> of forward 
  5157. iterators containing the combined results of performing 
  5158. both a <b>lower_bound</b> and an <b>upper_bound</b> operation. 
  5159. The first two iterator arguments must be at least <br>
  5160.  
  5161. </page>
  5162. <page pagename="20.5.11<tt> <b>lower_bound</b></tt>, <b>upper_bound</b> and ">
  5163. forward iterators. The third argument is the value for 
  5164. which to determine the equal range. The function 
  5165. returns a <b>pair</b> of forward iterators for the lower bound 
  5166. (<b>eq.first</b>) and upper bound (<b>eq.second</b>), respectively. <br>
  5167. <spacer width=16 height=1>Functions <b>lower_bound</b>, <b>upper_bound</b> and 
  5168. <b>equal_range</b> are often used to locate insertion points in 
  5169. sorted sequences. Line 40 uses <b>lower_bound</b> to locate 
  5170. the first point at which <b>5</b> can be inserted in order in <b>v</b>. 
  5171. Line 46 uses <b>upper_bound</b> to locate the last point at 
  5172. which <b>7</b> can be inserted in order in <b>v</b>. Line 52 uses 
  5173. <b>equal_range</b> to locate the first and last points at which 
  5174. <b>5</b> can be inserted in order in <b>v</b>.<br>
  5175.  
  5176. </page>
  5177. <page pagename="20.5.11<tt> <b>lower_bound</b></tt>, <b>upper_bound</b> and ">
  5178. <b>Drag the correct term to the box associated with the 
  5179. attribute:</b><br>
  5180. <component type="drag" width=88 height=18 label="upper_bound" name="upper_bound">    <component type="drag" width=88 height=18 label="lower_bound" name="lower_bound">   <component type="drag" width=88 height=18 label="equal_range" name="equal_range">   <br>
  5181. Determines the first location in a sorted sequence of values at which an argument can be insertedwhile still maintaining the sorted order.<component type="drop" width=96 height=18 name="lower_bound">  <br>
  5182. Determines the last location in a sorted sequence of values at which an argument can be insertedwhile still maintaining the sorted order.<component type="drop" width=96 height=18 name="upper_bound">  <br>
  5183. Returns a pair of forward iterators that represent the lower bound and upper bound, respectively.<component type="drop" width=96 height=18 name="equal_range">  <br>
  5184. <component type=button name=b label="Check Your Answer" width=125 height=24>
  5185.  
  5186. </page>
  5187. <page pagename="20.5.12 Heapsort">
  5188. <b>20.5.12 Heapsort</b><br>
  5189. <a href="^Code::c:s0p23"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.37</a> demonstrates the Standard Library 
  5190. functions for performing the heapsort sorting algorithm. 
  5191. Heapsort is a sorting algorithm in which an array of 
  5192. elements is arranged into a special binary tree called a 
  5193. <i>heap</i>. The key features of a heap are that the largest 
  5194. element is always at the top of the heap and the values 
  5195. of the children of any node in the binary tree are always 
  5196. less than or equal to that node's value. A heap arranged 
  5197. in this manner is often called a <i>maxheap</i>. Heapsort is 
  5198. generally discussed in the computer science courses 
  5199. called "Data Structures" and "Algorithms."<br>
  5200. <spacer width=16 height=1>Line 19<br>
  5201.  
  5202. </page>
  5203. <page pagename="20.5.12 Heapsort">
  5204. <font size=2><br></font><font size=11><pre>
  5205. make_heap( v.begin(), v.end() );<p>
  5206. </pre></font>
  5207. uses function <b>make_heap</b> to take a sequence of values 
  5208. in the range <b>v.begin()</b> up to, but not including, <b>v.end()</b> 
  5209. and create a heap that can be used to produce a sorted 
  5210. sequence. The two iterator arguments must be random-
  5211. access iterators, so this function will only work with 
  5212. arrays, <b>vectors</b> and <b>deques</b>. A second version of this 
  5213. function takes as a third argument a binary predicate 
  5214. function for comparing values.<br>
  5215. <spacer width=16 height=1>Line 22<br>
  5216. <font size=2><br></font><font size=11><pre>
  5217. sort_heap( v.begin(), v.end() );<p>
  5218. </pre></font>
  5219. uses function <b>sort_heap</b> to sort a sequence of values in 
  5220. the range <b>v.begin()</b> up to, but not including, <b>v.end()</b> that <br>
  5221.  
  5222. </page>
  5223. <page pagename="20.5.12 Heapsort">
  5224. are already arranged in a heap. The two iterator 
  5225. arguments must be random-access iterators. A second 
  5226. version of this function takes as a third argument a 
  5227. binary predicate function for comparing values.<br>
  5228. Line 32<br>
  5229. <font size=2><br></font><font size=11><pre>
  5230. push_heap( v2.begin(), v2.end() );<p>
  5231. </pre></font>
  5232. uses function <b>push_heap</b> to add a new value into a 
  5233. heap. We take one element of array <tt><b>a</b></tt> at a time, append 
  5234. that element to the end of <b>vector v2</b> and perform the 
  5235. <b>push_heap</b> operation. If the appended element is the 
  5236. only element in the <b>vector</b>, the <b>vector</b> is already a heap. 
  5237. Otherwise, function <b>push_heap</b> rearranges the 
  5238. elements of the <b>vector</b> into a heap. Each time <br>
  5239.  
  5240. </page>
  5241. <page pagename="20.5.12 Heapsort">
  5242. <b>push_heap</b> is called, it assumes that the last element 
  5243. currently in the <b>vector</b> (i.e., the one that is appended 
  5244. before the <b>push_heap</b> function call) is the element 
  5245. being added to the heap and that all other elements in 
  5246. the <b>vector</b> are already arranged as a heap. The two 
  5247. iterator arguments to <b>push_heap</b> must be random-
  5248. access iterators. A second version of this function takes 
  5249. as a third argument a binary predicate function for 
  5250. comparing values.<br>
  5251. <spacer width=16 height=1>Line 39<br>
  5252. <font size=2><br></font><font size=11><pre>
  5253. pop_heap( v2.begin(), v2.end() - i );<p>
  5254. </pre></font>
  5255. uses function <b>pop_heap</b> to remove the top element of 
  5256. the heap. This function assumes that the elements in the <br>
  5257.  
  5258. </page>
  5259. <page pagename="20.5.12 Heapsort">
  5260. range specified by its two random-access iterator 
  5261. arguments are already a heap. Repeatedly removing the 
  5262. top element of a heap eventually results in a sorted 
  5263. sequence of values. Function <b>pop_heap</b> swaps the first 
  5264. element of the heap (<b>v2.begin()</b> in this example) with 
  5265. the last element of the heap (the element before 
  5266. <b>v2.end() - i</b> in this example), then ensures that the 
  5267. elements up to, but not including, the last element still 
  5268. form a heap. Notice in the output that after the 
  5269. <b>pop_heap</b> operations, the <b>vector</b> is sorted in ascending 
  5270. order. A second version of this function takes as a third 
  5271. argument a binary predicate function for comparing 
  5272. values.<br>
  5273.  
  5274. </page>
  5275. <page pagename="20.5.12 Heapsort">
  5276. <b>Drag the correct term to the box associated with the 
  5277. attribute:</b><br>
  5278. <component type="drag" width=72 height=18 label="make_heap" name="make_heap">    <component type="drag" width=72 height=18 label="sort_heap" name="sort_heap">   <component type="drag" width=72 height=18 label="push_heap" name="push_heap">   <component type="drag" width=64 height=18 label="pop_heap" name="pop_heap">   <br>
  5279. Sort a sequence of values in the heap.<component type="drop" width=80 height=18 name="sort_heap">  <br>
  5280. Add a new value to the heap.<component type="drop" width=80 height=18 name="push_heap">  <br>
  5281. Create a heap that can be used to produce a sorted sequence.<component type="drop" width=80 height=18 name="make_heap">  <br>
  5282. Remove the top element of the heap.<component type="drop" width=80 height=18 name="pop_heap">  <br>
  5283. <component type=button name=b label="Check Your Answer" width=125 height=24>
  5284.  
  5285. </page>
  5286. <page pagename="20.5.13<tt> <b>min</b></tt> and <b>max </b> ">
  5287. <b>20.5.13<tt> <b>min</b></tt> and <b>max </b> </b><br>
  5288. Algorithms <b>min</b> and <b>max</b> determine the minimum of 
  5289. two elements and the maximum of two elements, 
  5290. respectively. The program of <a href="^Code::c:s0p24"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 20.38</a> demonstrates 
  5291. <b>min</b> and <b>max</b> for <b>int</b> and <b>char</b> values.<br>
  5292.  
  5293. </page>
  5294. <page pagename="20.5.14 Algorithms Not Covered in this Chapter">
  5295. <b>20.5.14 Algorithms Not Covered in this Chapter</b><br>
  5296. <a href="^Illustration::c:s0p20"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 20.39</a> discusses the algorithms that are not 
  5297. covered in this chapter. <br>
  5298.  
  5299. </page>
  5300. </section>
  5301. <section type=Body name=Default title="20.6 Class bitset  ">
  5302. <page>
  5303. <font size=18 bold>20.6 Class <b>bitset </b> </font><hr>
  5304. Class <b>bitset</b> makes it easy to create and manipulate <i>bit 
  5305. sets</i>. Bit sets are useful for representing a set of bit 
  5306. flags. <b>bitsets</b> are fixed in size at compile time. <br>
  5307. <font size=2><br></font><font size=11><pre>
  5308. bitset< size > b;<p>
  5309. </pre></font>
  5310. creates <b>bitset b</b> in which every bit is initially <b>0</b>.<br>
  5311. <font size=2><br></font><font size=11><pre>
  5312. b.set( bitNumber );<p>
  5313. </pre></font>
  5314. sets bit <b>bitNumber</b> of <b>bitset b</b> "on." The expression 
  5315. <b>b.set()</b> sets all bits in <b>b</b> "on."<br>
  5316. <font size=2><br></font><font size=11><pre>
  5317. b.reset( bitNumber );<p>
  5318. </pre></font>
  5319.  
  5320. </page>
  5321. <page>
  5322. sets bit <b>bitNumber</b> of <b>bitset b</b> "off." The expression 
  5323. <b>b.reset()</b> sets all bits in <b>b</b> "off."<br>
  5324. <font size=2><br></font><font size=11><pre>
  5325. b.flip( bitNumber );<p>
  5326. </pre></font>
  5327. "flips" bit <b>bitNumber</b> of <b>bitset b</b> (e.g., if the bit is on, 
  5328. <b>flip</b> sets it off). The expression <b>b.flip()</b> flips all bits in <b>b</b>.<br>
  5329. <font size=2><br></font><font size=11><pre>
  5330. b[ bitNumber ];<p>
  5331. </pre></font>
  5332. returns a reference to the bit <b>bitNumber</b> of <b>bitset b</b>. 
  5333. Similarly, <br>
  5334. <font size=2><br></font><font size=11><pre>
  5335. b.at( bitNumber );<p>
  5336. </pre></font>
  5337. performs range checking on <b>bitNumber</b> first. Then, if 
  5338. <b>bitNumber</b> is in range, <b>at</b> returns a reference to the bit. 
  5339. Otherwise, <b>at</b> throws an <b>out_of_range</b> exception.<br>
  5340.  
  5341. </page>
  5342. <page>
  5343. <font size=2><br></font><font size=11><pre>
  5344. b.test( bitNumber );<p>
  5345. </pre></font>
  5346. performs range checking on <b>bitNumber</b> first. Then, if 
  5347. <b>bitNumber</b> is in range, <b>test</b> returns <b>true</b> if the bit is on 
  5348. and <b>false</b> if the bit is off. Otherwise, <b>test</b> throws an 
  5349. <b>out_of_range</b> exception.<br>
  5350. <spacer width=16 height=1>The expression<br>
  5351. <font size=2><br></font><font size=11><pre>
  5352. b.size()<p>
  5353. </pre></font>
  5354. returns the number of bits in <b>bitset b</b>.<br>
  5355. <spacer width=16 height=1>The expression<br>
  5356. <font size=2><br></font><font size=11><pre>
  5357. b.count()<p>
  5358. </pre></font>
  5359. returns the number of bits that are set in <b>bitset b</b>.<br>
  5360. <spacer width=16 height=1>The expression<br>
  5361.  
  5362. </page>
  5363. <page>
  5364. <font size=2><br></font><font size=11><pre>
  5365. b.any()<p>
  5366. </pre></font>
  5367. returns <b>true</b> if any bit is set in <b>bitset b</b>.<br>
  5368. <spacer width=16 height=1>The expression<br>
  5369. <font size=2><br></font><font size=11><pre>
  5370. b.none()<p>
  5371. </pre></font>
  5372. returns <b>true</b> if none of the bits are set in <b>bitset b</b>.<br>
  5373. <spacer width=16 height=1>The expressions<br>
  5374. <font size=2><br></font><font size=11><pre>
  5375. b == b1<p>
  5376. b != b1<p>
  5377. </pre></font>
  5378. compare the two <b>bitsets</b> for equality and inequality, 
  5379. respectively.<br>
  5380. <spacer width=16 height=1>Each of the bitwise assignment operators <tt><b>&=</b></tt>, <tt><b>|=</b></tt> and <tt><b>^=</b></tt> 
  5381. can be used to combine <b>bitsets</b>, For example,<br>
  5382.  
  5383. </page>
  5384. <page>
  5385. <font size=2><br></font><font size=11><pre>
  5386. b &= b1;<p>
  5387. </pre></font>
  5388. performs a bit-by-bit logical AND between <b>bitsets b</b> 
  5389. and <b>b1</b>. The result is stored in <b>b</b>. Bitwise logical OR 
  5390. and bitwise logical XOR are performed by<br>
  5391. <font size=2><br></font><font size=11><pre>
  5392. b != b1;<p>
  5393. b ^= b2;<p>
  5394. </pre></font>
  5395. The expression<br>
  5396. <font size=2><br></font><font size=11><pre>
  5397. b >>= n;<p>
  5398. </pre></font>
  5399. shifts the bits in <b>bitset b</b> right by <b>n</b> positions.<br>
  5400. <spacer width=16 height=1>The expression<br>
  5401. <font size=2><br></font><font size=11><pre>
  5402. b <<= n;<p>
  5403. </pre></font>
  5404. shifts the bits in <b>bitset b</b> left by <b>n</b> positions.<br>
  5405.  
  5406. </page>
  5407. <page>
  5408. The expressions<br>
  5409. <font size=2><br></font><font size=11><pre>
  5410. b.to_string()<p>
  5411. b.to_ulong()<p>
  5412. </pre></font>
  5413. convert <b>bitset b</b> to a <b>string</b> and a <b>long</b>, respectively. <br>
  5414. <spacer width=16 height=1><a href="^Code::c:s0p25"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 20.40</a> revisits the Sieve of Eratosthenes for 
  5415. finding prime numbers we discussed in Exercise 4.29. 
  5416. A <b>bitset</b> is used instead of an array to implement the 
  5417. algorithm. The program displays all the prime numbers 
  5418. from 2 to 1023 then allows the user to enter a number to 
  5419. determine if that number is prime.<br>
  5420. <spacer width=16 height=1>Line 14 <br>
  5421. <font size=2><br></font><font size=11><pre>
  5422. bitset< size > sieve;<p>
  5423. </pre></font>
  5424.  
  5425. </page>
  5426. <page>
  5427. creates a <b>bitset</b> of <b>size</b> bits (<b>size</b> is 1024 in this 
  5428. example). We ignore the bits at positions 0 and 1 in this 
  5429. program. By default, all the bits in the <b>bitset</b> are set 
  5430. "off." The code<br>
  5431. <font size=2><br></font><font size=11><pre>
  5432. // perform Sieve of Eratosthenes<p>
  5433. int finalBit = sqrt( sieve.size() ) + 1;<p>
  5434. for ( i = 2; i < finalBit; ++i ) <p>
  5435.    if ( sieve.test( i ) ) <p>
  5436.       for ( int j = 2 * i; j < size; j += i ) <p>
  5437.          sieve.reset( j );<p>
  5438. </pre></font>
  5439. determines all the prime numbers from 2 to 1023. The 
  5440. integer <b>finalBit</b> is used to determine when the 
  5441. algorithm is complete. The basic algorithm is that a <br>
  5442.  
  5443. </page>
  5444. <page>
  5445. number is prime if it has no divisors other than 1 and 
  5446. itself. Starting with the number 2, once we know a 
  5447. number is prime, we can eliminate all multiples of that 
  5448. number. The number 2 is only divisible by 1 and itself, 
  5449. so it is prime. Therefore, we can eliminate 4, 6, 8, and 
  5450. so on. The number 3 is divisible by 1 and itself. 
  5451. Therefore, we can eliminate all multiples of 3 (keep in 
  5452. mind that all even numbers have already been 
  5453. eliminated). <br>
  5454.  
  5455. </page>
  5456. <page>
  5457. <b>Drag the correct term to the box associated with the 
  5458. attribute:</b><br>
  5459. <component type="drag" width=48 height=18 label="bitset" name="bitset">    <component type="drag" width=40 height=18 label="count" name="count">   <component type="drag" width=32 height=18 label="flip" name="flip">   <component type="drag" width=32 height=18 label="test" name="test">   <component type="drag" width=16 height=18 label="at" name="at">   <component type="drag" width=24 height=18 label="any" name="any">   <component type="drag" width=32 height=18 label="none" name="none">   <component type="drag" width=32 height=18 label="size" name="size"><br>
  5460. Returns true if at least one bit is on.<component type="drop" width=56 height=18 name="any">  <br>
  5461. Returns true if all bits are off.<component type="drop" width=56 height=18 name="none">  <br>
  5462. Reverses every bit.<component type="drop" width=56 height=18 name="flip">  <br>
  5463. Class that represents a set of bit flags.<component type="drop" width=56 height=18 name="bitset">  <br>
  5464. Returns a reference to a bit.<component type="drop" width=56 height=18 name="at">  <br>
  5465. Returns the total number of bits.<component type="drop" width=56 height=18 name="size">  <br>
  5466. Returns number of bits that are set.<component type="drop" width=56 height=18 name="count">  <br>
  5467. Returns the state of a bit.<component type="drop" width=56 height=18 name="test">  <br>
  5468. <component type=button name=b label="Check Your Answer" width=125 height=24>
  5469.  
  5470. </page>
  5471. </section>
  5472. <section type=Body name=Default title="20.7 Function Objects ">
  5473. <page>
  5474. <font size=18 bold>20.7 Function Objects </font><hr>
  5475. Function objects and function adapters are provided to 
  5476. make STL more flexible. A <i>function object</i> contains a 
  5477. function that may be invoked off the object using 
  5478. <tt><b>operator()</b></tt>. STL's function objects and adaptors are 
  5479. prototyped in <tt><b><functional></b></tt>. A function object may also 
  5480. encapsulate data with the enclosed function. The 
  5481. standard function objects are <b>inlined</b> for performance. 
  5482. STL function objects are shown in <a href="^Illustration::c:s0p25"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 20.41</a>.<br>
  5483. <spacer width=16 height=1>The program of <a href="^Code::c:s0p26"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 20.42</a> demonstrates the 
  5484. <b>accumulate</b> numeric algorithm (discussed in <a href="^Code::c:s0p16"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 
  5485. 20.30</a>) to calculate the sum of the squares of the <br>
  5486.  
  5487. </page>
  5488. <page>
  5489. elements in a <b>vector</b>. The fourth argument to 
  5490. <b>accumulate</b> is a binary function object or a function 
  5491. pointer to a binary function that takes two arguments 
  5492. and returns a result. Function <b>accumulate</b> is 
  5493. demonstrated twice--once with a function pointer to a 
  5494. binary function and once with a function object. <br>
  5495. <spacer width=16 height=1>Lines 14 and 15<br>
  5496. <font size=2><br></font><font size=11><pre>
  5497. int sumSquares( int total, int value ) <p>
  5498.    { return total + value * value; }<p>
  5499. </pre></font>
  5500. define function <b>sumSquares</b> that squares its second 
  5501. argument <b>value</b>, adds that square and its first argument 
  5502. <b>total</b>, and returns the sum. Function <b>accumulate</b> will 
  5503. repeatedly pass the elements of the sequence over <br>
  5504.  
  5505. </page>
  5506. <page>
  5507. which it iterates as the second argument to <b>sumSquares</b> 
  5508. in the example. On the first call to <b>sumSquares</b>, the 
  5509. first argument will be the initial value of the <tt><b>total</b></tt> 
  5510. (which is supplied as the third argument to accumulate; 
  5511. <tt><b>0</b></tt> in this program). All subsequent calls to <b>sumSquares</b> 
  5512. receive as the first argument the running sum returned 
  5513. by the previous call to <b>sumSquares</b>. When <b>accumulate</b> 
  5514. completes, it returns the sum of the squares of all the 
  5515. elements in the sequence.<br>
  5516. <spacer width=16 height=1>Lines 19 through 25<br>
  5517. <font size=2><br></font><font size=11><pre>
  5518. template< class T > <p>
  5519. class SumSquaresClass : binary_function< T, T, <p>
  5520.     T ><p>
  5521. </pre></font>
  5522.  
  5523. </page>
  5524. <page>
  5525. <font size=2><br></font><font size=11><pre>
  5526. {<p>
  5527. public:<p>
  5528.    const T &operator()( const T &total, <p>
  5529.        const T &value )<p>
  5530.       { return total + value * value; }<p>
  5531. };<p>
  5532. </pre></font>
  5533. define class <b>SumSquaresClass</b> that inherits from class 
  5534. <b>binary_function</b> (in header file <tt><b><functional></b></tt>). Classes 
  5535. that inherit from <b>binary_function</b> define the 
  5536. overloaded <b>operator()</b> function with two arguments. 
  5537. Class <b>SumSquaresClass</b> is used to define function 
  5538. objects for which the overloaded <b>operator()</b> functions 
  5539. perform the same task as function <b>sumSquares</b>. The <br>
  5540.  
  5541. </page>
  5542. <page>
  5543. three type parameters (<b>T</b>) to the template 
  5544. <b>binary_function</b> are the type of the first argument to 
  5545. <b>operator()</b>, the type of the second argument to 
  5546. <b>operator()</b> and the return type of <b>operator()</b>, 
  5547. respectively. Function <b>accumulate</b> will repeatedly pass 
  5548. the elements of the sequence over which it iterates as 
  5549. the second argument to function <b>operator()</b> that is 
  5550. invoked off an object of class <b>SumSquaresClass</b> that is 
  5551. passed to the <b>accumulate</b> algorithm. On the first call to 
  5552. <b>operator()</b>, the first argument will be the initial value 
  5553. of the <b>total</b> (which is supplied as the third argument to 
  5554. accumulate; <b>0</b> in this program). All subsequent calls to 
  5555. <b>operator()</b> receive as the first argument the result <br>
  5556.  
  5557. </page>
  5558. <page>
  5559. returned by the previous call to <b>operator()</b>. When 
  5560. <b>accumulate</b> completes, it returns the sum of the squares 
  5561. of all the elements in the sequence.<br>
  5562. <spacer width=16 height=1>Line 37<br>
  5563. <font size=2><br></font><font size=11><pre>
  5564. result = accumulate( v.begin(), v.end(), 0,<p>
  5565.      sumSquares );<p>
  5566. </pre></font>
  5567. calls function <b>accumulate</b> with a pointer to function 
  5568. <b>sumSquares</b> as its last argument.<br>
  5569. <spacer width=16 height=1>The statement at lines 41 and 42<br>
  5570. <font size=2><br></font><font size=11><pre>
  5571. result = accumulate( v.begin(), v.end(), 0,<p>
  5572.      SumSquaresClass< int >() );<p>
  5573. </pre></font>
  5574. calls function <b>accumulate</b> with an object of class 
  5575. <b>SumSquaresClass</b> as the last argument. The expression <br>
  5576.  
  5577. </page>
  5578. <page>
  5579. <b>SumSquaresClass< int >() </b>creates an instance of class 
  5580. <b>SumSquaresClass</b> that is passed to <b>accumulate</b> which 
  5581. uses the object to invoke <b>operator()</b>. The preceding 
  5582. statement could be written as two separate statements as 
  5583. follows:<br>
  5584. <font size=2><br></font><font size=11><pre>
  5585. SumSquaresClass< int > sumSquaresObj;<p>
  5586. result = accumulate( v.begin(), v.end(), 0,<p>
  5587.      sumSquaresObj );<p>
  5588. </pre></font>
  5589. The first line defines an object of class 
  5590. <b>SumSquaresClass</b>. That object is then passed to  
  5591. <a href="^Engineer::c:s0p14"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>function <b>accumulate</b> and used to invoke the overloaded 
  5592. <tt><b>operator()</b></tt> function.<br>
  5593.  
  5594. </page>
  5595. </section>
  5596. <section type=Body name=Default title="20.8 Summary">
  5597. <page>
  5598. <font size=18 bold>20.8 Summary</font><hr>
  5599. <indent width=8 delay>*   Using STL can save considerable time and effort, 
  5600. and result in higher quality programs.</indent>
  5601. <indent width=8 delay>*   The choice of what Standard Library container to use 
  5602. in a particular application is often based on performance considerations.</indent>
  5603. <indent width=8 delay>*   STL containers are all "templatized" so that you can 
  5604. tailor them to hold the type of data relevant to your particular applications.</indent>
  5605. <indent width=8 delay>*   STL includes many popular data structures as containers and provides many algorithms that programs use 
  5606. to process data in these containers.</indent>
  5607.  
  5608. </page>
  5609. <page>
  5610. <indent width=8 delay>*   STL containers are in three major categories--
  5611. <i>sequence containers</i>, <i>associative containers</i> and <i>container adapters</i>. The sequence containers and associative containers are collectively referred to as the <i>first-
  5612. class containers</i>. </indent>
  5613. <indent width=8 delay>*   Four other types are considered "near containers" 
  5614. because they exhibit similar capabilities to the first-
  5615. class containers, but do not support all the capabilities 
  5616. of first-class containers--array, <b>string</b>, <b>bitset</b> and <b>valarray</b>. </indent>
  5617. <indent width=8 delay>*   A <b>vector</b> provides rapid insertion and deletion at the 
  5618. back of the <b>vector</b> and direct access to any element. 
  5619. <b>vectors</b> support random-access iterators.</indent>
  5620.  
  5621. </page>
  5622. <page>
  5623. <indent width=8 delay>*   A <b>deque</b> provides rapid insertion and deletion at the 
  5624. front or back of the <b>deque</b> and direct access to any element. <b>deques</b> support random-access iterators.</indent>
  5625. <indent width=8 delay>*   A <b>list</b> provides rapid insertion and deletion anywhere 
  5626. in the <b>list</b>. <b>lists</b> support bidirectional iterators.</indent>
  5627. <indent width=8 delay>*   A <b>set</b> provides rapid lookup of a key. No duplicate 
  5628. keys are allowed. <b>sets</b> support bidirectional iterators.</indent>
  5629. <indent width=8 delay>*   A <b>multiset</b> provides rapid lookup of a key. Duplicate 
  5630. keys are allowed. <b>multisets</b> support bidirectional iterators.</indent>
  5631. <indent width=8 delay>*  A <b>map</b> provides rapid lookup of a key and its corresponding "mapped" value. No duplicate keys are 
  5632. allowed (i.e., a one-to-one mapping). <b>maps</b> support </indent>
  5633.  
  5634. </page>
  5635. <page>
  5636. <indent width=8 delay>*   bidirectional iterators.</indent>
  5637. <indent width=8 delay>*   A <b>multimap</b> provides rapid lookup of a key and its 
  5638. corresponding "mapped" values. Duplicate keys are 
  5639. allowed (i.e., a one-to-many mapping). <b>multimaps</b> support bidirectional iterators.</indent>
  5640. <indent width=8 delay>*   A <b>stack</b> provides a last-in-first-out (LIFO) data structure.</indent>
  5641. <indent width=8 delay>*   A <b>queue</b> provides a first-in-first-out (FIFO) data 
  5642. structure.</indent>
  5643. <indent width=8 delay>*   A <b>priority_queue</b> provides a first-in-first-out (FIFO) 
  5644. data structure with the highest priority item always at 
  5645. the front of the <b>priority_queue</b>.</indent>
  5646. <indent width=8 delay>*  STL has been carefully designed so that the contain</indent>
  5647.  
  5648. </page>
  5649. <page>
  5650. <indent width=8 delay>*   ers provide similar functionality. There are many 
  5651. generic operations that apply to all containers, and other 
  5652. operations that apply to subsets of similar containers. 
  5653. This contributes to the extensibility of the STL. </indent>
  5654. <indent width=8 delay>*   STL avoids <b>virtual</b> functions in favor of using 
  5655. generic programming with templates to achieve better 
  5656. execution-time performance.</indent>
  5657. <indent width=8 delay>*   It is important to ensure that the type of element 
  5658. being stored in an STL container supports a minimum 
  5659. set of functionality including a copy constructor, an 
  5660. assignment operator and--for associative containers--a 
  5661. less than operator (<tt><b><</b></tt>). </indent>
  5662. <indent width=8 delay>*  Iterators are used with sequences that may be in con</indent>
  5663.  
  5664. </page>
  5665. <page>
  5666. <indent width=8 delay>*   tainers, or may be input sequences or output sequences. </indent>
  5667. <indent width=8 delay>*   Input iterators are used to read an element from a 
  5668. container. An input iterator can move only in the forward direction (i.e., from the beginning of the container 
  5669. to the end of the container) one element at a time. Input 
  5670. iterators support only one-pass algorithms.</indent>
  5671. <indent width=8 delay>*   Output iterators are used to write an element to a 
  5672. container. An output iterator can move only in the forward direction one element at a time. Output iterators 
  5673. support only one-pass algorithms.</indent>
  5674. <indent width=8 delay>*   Forward iterators combine the capabilities of input 
  5675. and output iterators. Forward iterators support multi-
  5676. pass algorithms.</indent>
  5677.  
  5678. </page>
  5679. <page>
  5680. <indent width=8 delay>*   Bidirectional iterators combine the capabilities of a 
  5681. forward iterator with the ability to move in the backward direction.</indent>
  5682. <indent width=8 delay>*   Random-access iterators combine the capabilities of 
  5683. a bidirectional iterator with the ability to directly access 
  5684. any element of the container, i.e., to jump forward or 
  5685. backward by an arbitrary number of elements.</indent>
  5686. <indent width=8 delay>*   The category of iterator supported by each container 
  5687. determines whether that container can be used with specific algorithms in the STL. Containers that support 
  5688. random-access iterators can be used with all algorithms 
  5689. in the STL. </indent>
  5690. <indent width=8 delay>*  Pointers into arrays may be used in place of iterators </indent>
  5691.  
  5692. </page>
  5693. <page>
  5694. <indent width=8 delay>*   in all STL algorithms.</indent>
  5695. <indent width=8 delay>*   STL includes approximately 70 standard algorithms. 
  5696. Mutating-sequence algorithms result in modifications 
  5697. to container elements. Non-mutating sequence algorithms do not modify the container elements.</indent>
  5698. <indent width=8 delay>*   Functions <b>fill</b> and <b>fill_n</b> set every element in a range 
  5699. of container elements to a specific value.</indent>
  5700. <indent width=8 delay>*   Functions <b>generate</b> and <b>generate_n</b> use a <i>generator 
  5701. function</i> to create values for every element in a range of 
  5702. container elements. </indent>
  5703. <indent width=8 delay>*   Function <b>equal</b> compares two sequences of values 
  5704. for equality.</indent>
  5705. <indent width=8 delay>*  Function <b>mismatch</b> compares two sequences of val</indent>
  5706.  
  5707. </page>
  5708. <page>
  5709. <indent width=8 delay>*   ues and returns a <b>pair</b> of iterators indicating the location in each sequence of the mismatched elements. If all 
  5710. the elements match, the <b>pair</b> contains the result of function <tt><b>end</b></tt> for each sequence. </indent>
  5711. <indent width=8 delay>*   Function <b>lexicographical_compare</b> compares the 
  5712. contents of two sequences to determine if one sequence 
  5713. is less than another sequence (similar to a string comparison).</indent>
  5714. <indent width=8 delay>*   Functions <b>remove</b> and <b>remove_copy</b> delete all elements in a sequence that match a specified value. Functions <b>remove_if</b> and <b>remove_copy_if</b> delete all 
  5715. elements in a sequence for which the unary predicate 
  5716. function passed to the functions returns <b>true</b>.</indent>
  5717.  
  5718. </page>
  5719. <page>
  5720. <indent width=8 delay>*   Functions <b>replace</b> and <b>replace_copy</b> replace with a 
  5721. new value all elements in a sequence that match a specified value. Functions <b>replace_if</b> and <b>replace_copy_if</b> 
  5722. replace with a new value all elements in a sequence for 
  5723. which the unary predicate function passed to the functions returns <b>true</b>.</indent>
  5724. <indent width=8 delay>*   Function <b>random_shuffle</b> randomly orders the elements in a sequence.</indent>
  5725. <indent width=8 delay>*   Function <b>count</b> counts the elements with the specified value in a sequence. Function <b>count_if</b> counts the 
  5726. elements in a sequence for which the supplied unary 
  5727. predicate function returns <b>true</b>.</indent>
  5728. <indent width=8 delay>*  Function <b>min_element</b> locates the smallest element </indent>
  5729.  
  5730. </page>
  5731. <page>
  5732. <indent width=8 delay>*   in a sequence. Function <b>max_element</b> locates the largest element in a sequence.</indent>
  5733. <indent width=8 delay>*   Function <b>accumulate</b> sums the values in a sequence. 
  5734. A second version of this function receives a pointer to a 
  5735. general function that takes two arguments and returns a 
  5736. result. The general function determines how the elements in a sequence are accumulated.</indent>
  5737. <indent width=8 delay>*   Function <b>for_each</b> applies a general function to 
  5738. every element in a sequence. The general function takes 
  5739. one argument (that it should not modify) and returns 
  5740. <b>void</b>.</indent>
  5741. <indent width=8 delay>*  Function <b>transform</b> applies a general function to 
  5742. every element in a sequence. The general function takes </indent>
  5743.  
  5744. </page>
  5745. <page>
  5746. <indent width=8 delay>*   one argument (that it can modify) and returns the <b>transformed</b> result.</indent>
  5747. <indent width=8 delay>*   Function <b>find</b> locates an element in a sequence and, 
  5748. if the element is found, returns an iterator to the element; otherwise, <b>find</b> returns an iterator indicating the 
  5749. end of the sequence. Function <b>find_if</b> locates the first 
  5750. element for which the supplied unary predicate function 
  5751. returns <b>true</b>.</indent>
  5752. <indent width=8 delay>*   Function <b>sort</b> arranges the elements in a sequence in 
  5753. sorted order (ascending order by default or in the order 
  5754. indicated by a supplied binary predicate function).</indent>
  5755. <indent width=8 delay>*   Function <b>binary_search</b> determines if an element is 
  5756. in a sorted sequence.</indent>
  5757.  
  5758. </page>
  5759. <page>
  5760. <indent width=8 delay>*   Function <b>swap</b> exchanges two values. </indent>
  5761. <indent width=8 delay>*   Function <b>iter_swap</b> exchanges two values referred to 
  5762. by iterators. </indent>
  5763. <indent width=8 delay>*   Function <b>swap_ranges</b> exchanges the elements in 
  5764. one sequence with the elements in another sequence.</indent>
  5765. <indent width=8 delay>*   Function <b>copy_backward</b> copies elements in a 
  5766. sequence and places the elements in another sequence 
  5767. starting from the last element in the second sequence 
  5768. and working toward the beginning of the second 
  5769. sequence.</indent>
  5770. <indent width=8 delay>*  Function <b>merge</b> combines two sorted ascending 
  5771. sequences of values into a third sorted ascending 
  5772. sequence. Note that <b>merge</b> also works on unsorted </indent>
  5773.  
  5774. </page>
  5775. <page>
  5776. <indent width=8 delay>*   sequences, but does not produce a sorted sequence in 
  5777. that case.</indent>
  5778. <indent width=8 delay>*   A <b>back_inserter</b> uses the container's default capability for inserting an element at the end of the container. When an element is inserted into a container that 
  5779. has no more elements available, the container automatically grows in size. There are two other inserters--
  5780. <b>front_inserter</b> and <b>inserter</b>. A <b>front_inserter</b> inserts 
  5781. an element at the beginning of a container (specified as 
  5782. its argument) and an <b>inserter</b> inserts an element before 
  5783. the iterator supplied as its second argument in the container supplied as its first argument.</indent>
  5784. <indent width=8 delay>*  Function <b>unique</b> removes all duplicates from a </indent>
  5785.  
  5786. </page>
  5787. <page>
  5788. <indent width=8 delay>*   sorted sequence. </indent>
  5789. <indent width=8 delay>*   Function <b>reverse</b> reverses all the elements in a 
  5790. sequence.</indent>
  5791. <indent width=8 delay>*   Function <b>inplace_merge</b> merges two sorted 
  5792. sequences of elements in the same container. </indent>
  5793. <indent width=8 delay>*   Function <b>unique_copy</b> makes a copy of all the 
  5794. unique elements in a sorted sequence. </indent>
  5795. <indent width=8 delay>*   Function <b>reverse_copy</b> makes a reversed copy of the 
  5796. elements in a sequence.</indent>
  5797. <indent width=8 delay>*   Function <b>includes</b> compares two sorted sets of values 
  5798. to determine if every element of the second set is in the 
  5799. first set. If so, <b>includes</b> returns <b>true</b>; otherwise, 
  5800. <b>includes</b> returns <b>false</b>. </indent>
  5801.  
  5802. </page>
  5803. <page>
  5804. <indent width=8 delay>*   Function <b>set_difference</b> determines the elements 
  5805. from the first set of sorted values that are not in the second set of sorted values (both sets of values must be in 
  5806. ascending order using the same comparison function). </indent>
  5807. <indent width=8 delay>*   Function <b>set_intersection</b> determines the elements 
  5808. from the first set of sorted values that are in the second 
  5809. set of sorted values (both sets of values must be in 
  5810. ascending order using the same comparison function).</indent>
  5811. <indent width=8 delay>*   Function <b>set_symmetric_difference</b> determines the 
  5812. elements in the first set that are not in the second set 
  5813. and the elements in the second set that are not in the 
  5814. first set (both sets of values must be in ascending order 
  5815. using the same comparison function). </indent>
  5816.  
  5817. </page>
  5818. <page>
  5819. <indent width=8 delay>*   Function <b>set_union</b> creates a set of all the elements 
  5820. that are in either or both of the two sorted sets (both sets 
  5821. of values must be in ascending order using the same 
  5822. comparison function). </indent>
  5823. <indent width=8 delay>*   Function <b>lower_bound</b> determines the first location 
  5824. in a sorted sequence of values at which the third argument could be inserted in the sequence and the 
  5825. sequence would still be sorted in ascending order. </indent>
  5826. <indent width=8 delay>*   Function <b>upper_bound</b> determines the last location 
  5827. in a sorted sequence of values at which the third argument could be inserted in the sequence and the 
  5828. sequence would still be sorted in ascending order. </indent>
  5829. <indent width=8 delay>*  Function <b>equal_range</b> returns a <b>pair</b> of forward iter</indent>
  5830.  
  5831. </page>
  5832. <page>
  5833. <indent width=8 delay>*   ators containing the combined results of performing 
  5834. both a <b>lower_bound</b> and an <b>upper_bound</b> operation.</indent>
  5835. <indent width=8 delay>*   Heapsort is a sorting algorithm in which an array of 
  5836. elements is arranged into a special binary tree called a 
  5837. <i>heap</i>. The key features of a heap are that the largest element is always at the top of the heap and the values of 
  5838. the children of any node in the binary tree are always 
  5839. less than or equal to that node's value. A heap arranged 
  5840. in this manner is often called a <i>maxheap</i>. </indent>
  5841. <indent width=8 delay>*   Function <b>make_heap</b> takes a sequence of values and 
  5842. creates a heap that can be used to produce a sorted 
  5843. sequence. </indent>
  5844. <indent width=8 delay>*  Function <b>sort_heap</b> sorts a sequence of values that </indent>
  5845.  
  5846. </page>
  5847. <page>
  5848. <indent width=8 delay>*   are already arranged in a heap.</indent>
  5849. <indent width=8 delay>*   Function <b>push_heap</b> adds a new value into a heap. 
  5850. <b>push_heap</b> assumes that the last element currently in 
  5851. the container is the element being added to the heap and 
  5852. that all other elements in the container are already 
  5853. arranged as a heap. </indent>
  5854. <indent width=8 delay>*   Function <b>pop_heap</b> removes the top element of the 
  5855. heap. This function assumes that the elements are 
  5856. already arranged as a heap. </indent>
  5857. <indent width=8 delay>*   Function <b>min</b> determines the minimum of two values.</indent>
  5858. <indent width=8 delay>*   Function <b>max</b> determines the maximum of two values.</indent>
  5859.  
  5860. </page>
  5861. <page>
  5862. <indent width=8 delay>*   Class <b>bitset</b> makes it easy to create and manipulate 
  5863. <i>bit sets</i>. Bit sets are useful for representing a set of boolean flags. <b>bitsets</b> are fixed in size at compile time.</indent>
  5864.  
  5865. </page>
  5866. </section>
  5867. <section type=Body name=Default title="20.9 STL Resources on the Internet and the World Wide Web">
  5868. <page>
  5869. <font size=18 bold>20.9 STL Resources on the Internet and the 
  5870. World Wide Web</font><hr>
  5871. The following is a collection of Internet and World 
  5872. Wide Web STL resources. These sites include tutorials, 
  5873. references, FAQs, articles, books, interviews, the ANSI/
  5874. ISO C++ Draft Standard, and software.<br>
  5875. <font size=18><i>Tutorials
  5876. </i></font><br>
  5877. <font size=18><b>http://w6.infosys.tuwien.ac.at/Research/Component/
  5878. STL.newbie.html</b>  </font><br>
  5879. "Mumit's STL Newbie Guide" is a great reference for 
  5880. STL information. Some of the topics covered in this 
  5881. tutorial include: writing container objects, class <br>
  5882.  
  5883. </page>
  5884. <page>
  5885. constructors, class operators, pointers and STL, pointer 
  5886. wrapper for storing in STL containers, storing derived 
  5887. objects in an STL container, checking for item in a map, 
  5888. char*, predicates, comparators, general functions, STL 
  5889. iterators, iterator tags, copying between lists, copying 
  5890. between maps, adaptors in STL, remove vs. erase, 
  5891. sorting, and shuffling a deck of cards.<br>
  5892. <font size=18><b>http://www.cs.brown.edu/people/jak/programming/
  5893. stl-tutorial/tutorial.html</b>  </font><br>
  5894. This STL tutorial is organized by examples, philosophy, 
  5895. components and extending STL. You will find code 
  5896. examples using the STL components, useful 
  5897. explanations and helpful diagrams.<br>
  5898.  
  5899. </page>
  5900. <page>
  5901. <font size=18><b>http://web.ftech.net/~honeyg/articles/eff_stl.htm</b>  </font><br>
  5902. This STL tutorial provides information on the STL 
  5903. components, containers, stream and iterator adaptors, 
  5904. transforming and selecting values, filtering and 
  5905. transforming values, and objects.<br>
  5906. <font size=18><b>http://www-leland.stanford.edu/~iburrell/cpp/
  5907. stl.html</b>  </font><br>
  5908. This site provides links to STL resources including 
  5909. FAQs, FTP sites and tutorials. <br>
  5910. <font size=18><b>http://web1.ftech.net/~honeyg/articles/tiny_stl.htm</b>  </font><br>
  5911. "A Tiny STL Primer" is an introduction to container 
  5912. members, iterators, algorithms and adaptors using code <br>
  5913.  
  5914. </page>
  5915. <page>
  5916. examples. You will also find short lists of on-line STL 
  5917. resources and books.<br>
  5918. <font size=18><b>http://www.xraylith.wisc.edu/~khan/software/stl/
  5919. os_examples/examples.html</b>  </font><br>
  5920. This site is helpful for people just learning about the 
  5921. STL. You will find an introduction to the STL and 
  5922. ObjectSpace STL Tool Kit examples.<br>
  5923. <font size=18>http://www.cs.bham.ac.uk/~jdm/cpp.html</font><br>
  5924. This is one of the most extensive resource lists for C++ 
  5925. and STL information. The STL links include FAQs, 
  5926. tutorials, articles, compilers and more.<br>
  5927.  
  5928. </page>
  5929. <page>
  5930. <font size=18><i>References
  5931. </i></font><br>
  5932. <font size=18><b>http://www.sgi.com/Technology/STL/
  5933. other_resources.html</b>  </font><br>
  5934. This site has a list of over 15 STL related Web sites and 
  5935. a short list of suggested books on the STL.<br>
  5936. <font size=18><b>ftp://ftp.blueneptune.com/pub/users/yotam/stlqr-
  5937. 1.01.tar.gz<p>
  5938. ftp://ftp.blueneptune.com/pub/users/yotam/
  5939. stlqr101.zip</b>  </font><br>
  5940. The "STL-Quick-Reference version 1.01" <br>
  5941. <spacer width=16 height=1><b>http://www.cs.rpi.edu/projects/STL/stl/stl.html </b> <br>
  5942.  
  5943. </page>
  5944. <page>
  5945. This is the Standard Template Library Online Reference 
  5946. Home Page. You will find detailed explanations of the 
  5947. STL as well as links to other useful resources for 
  5948. information about the STL.<br>
  5949. <font size=18><b>http://www.sgi.com/Technology/STL/</b>  </font><br>
  5950. The Silicon Graphics Standard Template Library 
  5951. Programmer's Guide is a useful resource for STL 
  5952. information. You can download the STL from this site, 
  5953. find the latest information, design documentation, and 
  5954. links to other STL resources.<br>
  5955. <font size=18><b>http://www.ipmce.su/people/fbp/stl/stlport.html</b>  </font><br>
  5956. This site is a great, up-to-date STL resource. The 
  5957. contents on this site include STL adaptation <br>
  5958.  
  5959. </page>
  5960. <page>
  5961. information, Testsuite for STLport, Exception-
  5962. Handling Testsuite for STL, STL documentation, brief 
  5963. descriptions of current STL related projects, a list of 
  5964. known bugs with corrections, a list of STL-compliant 
  5965. Software Components and a list of other STL-related 
  5966. sites.<br>
  5967. <font size=18><i>FAQs
  5968. </i></font><br>
  5969. <font size=18><b>http://www-leland.stanford.edu/~iburrell/cpp/
  5970. stl.html</b>  </font><br>
  5971. This site provides links to STL resources including 
  5972. FAQs, FTP sites and tutorials. <br>
  5973.  
  5974. </page>
  5975. <page>
  5976. <font size=18><b>http://www.cs.bham.ac.uk/~jdm/cpp.html</b>  </font><br>
  5977. This is one of the most extensive resource lists for C++ 
  5978. and STL information. The STL links include FAQs, 
  5979. tutorials, articles, compilers and more.<br>
  5980. <font size=18><b>ftp://butler.hpl.hp.com/stl/stl.faq</b>  </font><br>
  5981. This FTP site is a FAQ sheet for the STL maintained by 
  5982. Marian Corcoran, a member of the ANSI committee 
  5983. and a C++ expert. <br>
  5984.  
  5985. </page>
  5986. <page>
  5987. <font size=18><i>Articles, Books and Interviews
  5988. </i></font><br>
  5989. <font size=18><b>http://www.sgi.com/Technology/STL/
  5990. other_resources.html</b>  </font><br>
  5991. This site has a list of over 15 STL-related Web sites and 
  5992. a short list of suggested books on the STL.<br>
  5993. <font size=18><b>http://www.byte.com/art/9510/sec12/art3.htm</b>  </font><br>
  5994. The Byte Magazine site has a copy of an article on the 
  5995. STL written by Alexander Stepanov. Stepanov, one of 
  5996. the creators of the Standard Template Library, provides 
  5997. information on the use of the STL in generic 
  5998. programming.<br>
  5999.  
  6000. </page>
  6001. <page>
  6002. <font size=18><b>ftp://ftp.cs.rpi.edu/pub/stl/</b>  </font><br>
  6003. The Hewlett-Packard implementation of the STL 
  6004. (Standard Template Library) documentation and 
  6005. research papers. This site also includes source code for 
  6006. the <i>STL Tutorial and Reference Guide: C++ 
  6007. Programming with the Standard Template Library</i> by 
  6008. D.R. Musser and Atul Saini, Addison-Wesley, Reading, 
  6009. MA, 1996.<br>
  6010.  
  6011. </page>
  6012. <page>
  6013. <font size=18><b>http://www.ipmce.su/people/fbp/stl/StepanovUSA.html<p>
  6014. http://www.sgi.com/Technology/STL/drdobbs-interview.html</b>  </font><br>
  6015. These interviews with Alexander Stepanov have some 
  6016. interesting information about the creation of the 
  6017. Standard Template Library. Stepanov talks about how 
  6018. the STL was conceptualized, generic programming, the 
  6019. acronym "STL" and more.<br>
  6020.  
  6021. </page>
  6022. <page>
  6023. <font size=18><b>http://www.cs.bham.ac.uk/~jdm/cpp.html</b>  </font><br>
  6024. This is one of the most extensive resource lists for C++ 
  6025. and STL information. The STL links include FAQs, 
  6026. tutorials, articles, compilers and more.<br>
  6027. <font size=18><i>ANSI/ISO C++ Draft Standard
  6028. </i></font><br>
  6029. <font size=18><b>http://www.maths.warwick.ac.uk/cpp/pub/wp/html/
  6030. cd2/index.html</b>  </font><br>
  6031. This site is the working paper for the "Draft Proposed 
  6032. International Standard for Information Systems--
  6033. Programming Language C++."<br>
  6034.  
  6035. </page>
  6036. <page>
  6037. <font size=18><b>http://math.nist.gov/tnt/stl.html</b>  </font><br>
  6038. This site is a resource for information on the C++ 
  6039. Standard Template Library. There are links to the HP 
  6040. STL web site, the Standard Template Library Online 
  6041. Reference Home Page, the draft of the ANSI C++ 
  6042. Standard, and suggested books on the subject.<br>
  6043. <font size=18><b>http://ourworld.compuserve.com/homepages/bloem/
  6044. bbstl.htm</b>  </font><br>
  6045. Download Stepanov and Lee's Standard Template 
  6046. Library document and the Proposed C++ Draft 
  6047. Standard document.<br>
  6048.  
  6049. </page>
  6050. <page>
  6051. <font size=18><b>http://www.dinkumware.com/refcpp.html</b>  </font><br>
  6052. This site contains useful information about the ANSI/
  6053. ISO Draft Standard C++ Library and contains extensive 
  6054. information about the Standard Template Library. <br>
  6055. <font size=18><b>http://www.cygnus.com/misc/wp/dec96pub/</b>  </font><br>
  6056. A complete on-line copy of the working paper for the 
  6057. Draft Proposed International Standard for Information 
  6058. Systems--Programming Language C++.<br>
  6059. <font size=18><i>Software
  6060. </i></font><br>
  6061. <font size=18><b>http://www.cs.rpi.edu/~musser/stl.html</b>  </font><br>
  6062. The RPI STL site includes information on how STL 
  6063. differs from other C++ libraries, how to compile <br>
  6064.  
  6065. </page>
  6066. <page>
  6067. programs that use STL, list of main STL include files, 
  6068. example programs that use STL, STL Container 
  6069. Classes, and STL Iterator Categories. It also provides a 
  6070. STL-compatible compiler list, FTP sites for STL source 
  6071. code and related materials.<br>
  6072. <font size=18><b>ftp://ftp.cs.rpi.edu/pub/stl/</b>  </font><br>
  6073. The Hewlett-Packard implementation of the STL 
  6074. (Standard Template Library) documentation and 
  6075. research papers. This site also includes source code for 
  6076. the <i>STL Tutorial and Reference Guide: C++ 
  6077. Programming with the Standard Template Library</i> by 
  6078. D.R. Musser and Atul Saini, Addison-Wesley, Reading, 
  6079. MA, 1996.<br>
  6080.  
  6081. </page>
  6082. <page>
  6083. <font size=18><b>http://www.cyberport.com/~tangent/programming/
  6084. stl/resources.html</b>  </font><br>
  6085. This STL resource site includes a list of STL-
  6086. compatible compilers and dozens of links to other STL 
  6087. related sites.<br>
  6088. <font size=18><b>http://www.mathcs.sjsu.edu/faculty/horstman/safestl.html</b>  </font><br>
  6089. Download SAFESTL.ZIP, a tool designed to find errors 
  6090. in programs using the STL.<br>
  6091. <font size=18><b>http://www.sirius.com/~ouchida/</b>  </font><br>
  6092. The Silicon Graphics, Inc. STL for Microsoft Visual 
  6093. C++ 5.0.<br>
  6094.  
  6095. </page>
  6096. <page>
  6097. <font size=18><b>http://www.objectspace.com/jgl/</b>  </font><br>
  6098. Object Space provides information about porting C++ 
  6099. to Java. You can download their Standards<ToolKit> 
  6100. portable class libraries free. Key features of the toolkit 
  6101. include containers, iterators, algorithms, allocators, 
  6102. strings and exceptions.<br>
  6103. <font size=18><b>http://www.cs.bham.ac.uk/~jdm/cpp.html</b> </font><br>
  6104. This is one of the most extensive resource lists for C++ 
  6105. and STL information. The STL links include FAQs, 
  6106. tutorials, articles, compilers and more.<br>
  6107.  
  6108. </page>
  6109. <page>
  6110. <font size=18><b>http://www.cs.rpi.edu/~wiseb/stl-borland.html</b>  </font><br>
  6111. "Using the Standard Template Library with Borland 
  6112. C++." This site is a useful reference for people using 
  6113. the Borland C++ compiler. The author has sections on 
  6114. warnings and incompatibilities.<br>
  6115. <font size=18><b>http://www.geocities.com/SiliconValley/Pines/2010/
  6116. note.txt</b>  </font><br>
  6117. This is a compilation of incompatibilities between STL 
  6118. and Microsoft Developer's C++ 4.2.<br>
  6119.  
  6120. </page>
  6121. <page>
  6122. <font size=18><b>http://www.microsoft.com/visualc/legacy/v4.0/pc/
  6123. techinfo/stlchg.htm</b>  </font><br>
  6124. Microsoft's "MFC and Standard Template Library 
  6125. (STL) Alert" site highlights some of the problems 
  6126. Visual C++ users might find when using the MFC and 
  6127. STL with Visual C++. Microsoft also provides links to 
  6128. other C++ resources.<br>
  6129.  
  6130. </page>
  6131. </section>
  6132. <section type=Body name=Default title="20.10 STL Bibliography">
  6133. <page>
  6134. <font size=18 bold>20.10 STL Bibliography</font><hr>
  6135. (Am97)<spacer width=20 height=1>Ammeraal, L., STL for C++ Programmers, 
  6136. New York, NY: John Wiley, 1997.<br>
  6137. <spacer width=16 height=1>(C++97)<spacer width=20 height=1>X3 Secretariat: Draft StandardThe C++ 
  6138. Language. X3J16/97-14882. Information Technology 
  6139. Council (NSITC), Washington, DC, USA: 1997.<br>
  6140. <spacer width=16 height=1>(Gl95)<spacer width=20 height=1>Glass, G., and B. Schuchert, The STL <Primer>, 
  6141. Upper Saddle River, NJ: Prentice Hall PTR, 1995.<br>
  6142. <spacer width=16 height=1>(He97)<spacer width=20 height=1>Henricson, M., and E. Nyquist, Industrial 
  6143. Strength C++: Rules and Recommendations, Upper 
  6144. Saddle River, NJ: Prentice Hall, 1997.<br>
  6145.  
  6146. </page>
  6147. <page>
  6148. (Ko97)<spacer width=20 height=1>Koenig, A., and B. Moo, Ruminations on C++, 
  6149. Reading, MA: Addison-Wesley, 1997.<br>
  6150. <spacer width=16 height=1>(Mu94)<spacer width=20 height=1>Musser, D. R., and A. A. Stepanov, "Algorithm-
  6151. Oriented Generic Libraries," Software Practice and 
  6152. Experience, Vol. 24, No. 7, July 1994.<br>
  6153. <spacer width=16 height=1>(Mu96)<spacer width=20 height=1>Musser, D. R., and A. Saini, STL Tutorial and 
  6154. Reference Guide: C++ Programming with the 
  6155. Standard Template Library, Reading, MA: Addison-
  6156. Wesley Publishing Company, 1996.<br>
  6157. <spacer width=16 height=1>(Ne95)<spacer width=20 height=1>Nelson, M., C++ Programmer's Guide to the 
  6158. Standard Template Library, Foster City, CA: 
  6159. Programmers Press, a Division of IDG Books 
  6160. Worldwide, Inc., 1995.<br>
  6161.  
  6162. </page>
  6163. <page>
  6164. (Po97)<spacer width=20 height=1>Pohl, I., C++ Distilled: A Concise ANSI/ISO 
  6165. Reference and Style Guide, Reading, MA: Addison-
  6166. Wesley, 1997.<br>
  6167. <spacer width=16 height=1>(Po97a)<spacer width=20 height=1>Pohl, I., Object-Oriented Programming Using 
  6168. C++, Second Edition, Reading, MA: Addison-Wesley 
  6169. Publishing Company, 1997.<br>
  6170. <spacer width=16 height=1>(St95)<spacer width=20 height=1>Stepanov, A., and M. Lee, "The Standard 
  6171. Template Library," Internet Distribution, Published at 
  6172. ftp://butler.hpl.hp.com/stl, July 7, 1995.<br>
  6173. <spacer width=16 height=1>(Sr94)<spacer width=20 height=1>Stroustrup, B., "Making a vector Fit for a 
  6174. Standard," The C++ Report, October 1994.<br>
  6175.  
  6176. </page>
  6177. </section>
  6178. <section type=Popup name=Debug title="Testing">
  6179. <page>
  6180. When programming 
  6181. pointer-based data 
  6182. structures and 
  6183. algorithms, we must do 
  6184. our own debugging and 
  6185. testing to be sure our 
  6186. data structures, classes 
  6187. and algorithms function 
  6188. properly. It is easy to 
  6189. make errors when <br>
  6190.  
  6191. </page>
  6192. <page>
  6193. manipulating pointers 
  6194. at this low a level. 
  6195. Memory leaks and 
  6196. memory-access 
  6197. violations are common 
  6198. in such custom code. 
  6199. For most programmers, 
  6200. and for most of the 
  6201. applications they will 
  6202. need to write, the <br>
  6203.  
  6204. </page>
  6205. <page>
  6206. prepackaged, 
  6207. templatized data 
  6208. structures of the STL 
  6209. are sufficient. Using the 
  6210. STL's code can avoid a 
  6211. great deal of testing and 
  6212. debugging time. One 
  6213. caution is that for large 
  6214. projects, template <br>
  6215.  
  6216. </page>
  6217. <page>
  6218. compile time can be 
  6219. significant.<br>
  6220. <br>
  6221.  
  6222. </page>
  6223. <page>
  6224. The <b>*</b> (dereferencing) 
  6225. operator of any <b>const</b> 
  6226. iterator returns a <b>const</b> 
  6227. reference to the 
  6228. container element, thus 
  6229. disallowing the use of 
  6230. non-<b>const</b> member 
  6231. functions.<br>
  6232. <br>
  6233.  
  6234. </page>
  6235. <page>
  6236. Operations performed 
  6237. on a <tt><b>const_iterator 
  6238. </b></tt>return <b>const</b> references 
  6239. to prevent modification 
  6240. to elements of the 
  6241. container being 
  6242. manipulated. Use 
  6243. <b>const_iterators</b> in 
  6244. preference to <b>iterators</b> 
  6245. where appropriate. This <br>
  6246.  
  6247. </page>
  6248. <page>
  6249. is another example of 
  6250. the principle of least 
  6251. privilege.<br>
  6252. <br>
  6253.  
  6254. </page>
  6255. <page>
  6256. Only random-access 
  6257. iterators support <b><</b>. It is 
  6258. better to use <b>!= </b>and 
  6259. <b>end()</b> to test for end of 
  6260. container.<br>
  6261. <br>
  6262.  
  6263. </page>
  6264. </section>
  6265.  
  6266. <section type=Popup name=AppletPopup title="Applet Examples">
  6267. <page>
  6268. This chapter does not contain any Applet Examples.
  6269. </page>
  6270. </section>
  6271. </chapter>
  6272. </html>
  6273. </html>
  6274.